2011-03-22 33 views
1

我不得不使用models.CharField在我的一个模型中存储一些额外的标志。所以我滥用田地的每封信作为旗帜。例如,“MM5”意味着“男性,已婚,年龄超过50岁”和“FS2”“女性,单身,年龄在20岁以上”。是否有任何可接受的方式来切割/重新组合Django查询集而不使用API​​?

我正在使用方法来查询/访问这些标志。当然,我不能在queryset API中使用这些方法。我使用列表解析调用方法来筛选初始查询集,并将其转化成一个普通的名单,这是大多数模板喂养不够好:

people = People.objects.filter(name__startswith='J') 
people_i_want = [p for p in people if p.myflags_ismale() and p.myflags_isolderthan(30)] 

那么,有没有办法重新转换这些任何ok'ish方式重新列入查询集?或者基于我的方法的输出对查询集进行斩波/过滤,而不是首先将其转换为普通列表?

回答

1

这可能是不必要的复杂以及不好的做法,试图将您的列表“重新转换”回QuerySet中,最好的做法是使用更聪明的QuerySet过滤。

您应该使用queryset filter regex语法来获得所需的功能。 Documentation here

例如使用regex相当于ismale()会是这样的......

People.objects.filter(myflags__regex=r'.M.') # <-- For matching something like 'MM5' 
# Please note I haven't tested this regex expression, but the principal is sound 


此外,虽然我承认不是一个数据库大师,我用这种“相当肯定标志“在charfield中是一种相当低效的做事方式。

1

如果必须转换列表回一个查询集,然后我用的成语是:

People.objects.filter(pk__in=[x.pk for x in list_of_objects]) 

显然,这再次访问数据库。但如果你真的需要它。

相关问题