有没有可以接受的方法来切换/重组Django查询集而不使用API​​?

时间:2011-03-22 01:05:09

标签: django list django-queryset

我被迫使用models.CharField在我的一个模型中存储一些额外的标志。所以我把这个领域的每个字母都当作一面旗帜。例如,'MM5'的意思是“男人,已婚,年龄在50岁以上”和“FS2”,“女性,单身,年龄在20岁以上”。

我正在使用方法来查询/访问这些标志。当然,我不能将这些方法与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)]

那么,有没有什么好的方法可以将这些列表重新转换回查询集?或者根据我的方法的输出切断/过滤查询集,而不是首先将其转换为普通列表?

2 个答案:

答案 0 :(得分:1)

尝试将列表重新“转换”回QuerySet可能是不必要的复杂和不好的做法,最好的办法是使用更聪明的QuerySet过滤。

您应该使用regex语法的查询集过滤器来获取所需的功能。 Documentation here

例如,使用ismale()的{​​{1}}相当于......

regex

<小时/> 此外,虽然我当然不是数据库大师,但我相当肯定在charfield中使用这种“标志”是一种相当低效的做事方式。

答案 1 :(得分:1)

如果必须将列表转换回查询集,那么我使用的习语是:

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

显然,这会再次击中数据库。但如果你真的需要它。