7

我想过滤 Django 对象,使其 "id modulo K == N" 。

这是在 python 中执行此操作的一种方法,但我希望它在 filter() 中:

for foo in Foo.objects.all():
  if foo.id % K == N:
    print foo

所以,我可以在这样的查询中使用 extra() (如果我错了,请纠正我):

Foo.objects.extra(where['id %% %s = %s' % (K,N)])

但是有没有办法使用F()

Django 支持对 F() 对象使用加法、减法、乘法、除法和模运算

注意:这是非常错误的:

Foo.objects.filter(id=F('id') % K)

我需要类似的东西:

Foo.objects.filter(id__mod(K)=N)

4

2 回答 2

4

Django 1.8 允许您在注释中使用 F() 对象。语法是:

Foo.objects.annotate(id_mod=F('id') % K).filter(id_mod=n)

该功能在#14030中实现。对于早期版本的 Django,您可以使用extra().

于 2013-11-12T23:41:50.480 回答
2

如果您考虑过滤器试图做什么,它会获取一个属性并执行比较。您实际上并没有id与任何东西进行比较,而是根据计算值进行过滤。 extra是执行这种基于计算的过滤的最合适的方法,尽管它听起来像是filter能够做到这一点。

于 2013-11-12T23:47:14.283 回答