我想过滤Django对象,使其“id modulo K == N”。
这是在python中执行此操作的方法,但我想在filter()中使用它:
for foo in Foo.objects.all():
if foo.id % K == N:
print foo
所以,我可以使用带有这样的查询的extra()(如果我错了请纠正我):
Foo.objects.extra(其中['id %%%s =%s'%(K,N)])
但有没有办法使用F()?
Django支持在F()对象中使用加法,减法,乘法,除法和模运算
注意:这是非常错误的:
Foo.objects.filter(id = F('id')%K)
我需要类似的东西:
Foo.objects.filter(id__mod(K)= N)
答案 0 :(得分:4)
Django 1.8允许您在注释中使用F()对象。语法是:
Foo.objects.annotate(id_mod=F('id') % K).filter(id_mod=n)
该功能已在#14030中实施。对于早期版本的Django,您可以使用extra()
。
答案 1 :(得分:2)
如果您考虑过滤器正在尝试做什么,它会采用属性并执行比较。您实际上并没有将id
与任何内容进行比较,而是根据计算值进行过滤。 extra
是执行此基于计算的过滤的最合适方式,尽管它听起来像filter
能够做到这一点。