使用F()在Django中进行模数查询

时间:2013-11-12 23:26:42

标签: python django modulus

我想过滤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)

2 个答案:

答案 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能够做到这一点。