django queryset中的模数?

ste*_*sia 8 django

是否已经有一种方法可以根据id % 4 == 0django queryset 选择对象?

到目前为止我找到的唯一解决方案是编写自定义转换,因为在Postgresql中似乎支持modulo,但是我遇到了错误.

这是我的代码:

from django.db.models import Lookup, Transform
from django.db.models.fields import Field, IntegerField, AutoField

class Modulo4(Transform):
    lookup_name = 'modulo4'

    def as_sql(self, compiler, connection):
        lhs, params = compiler.compile(self.lhs)
        return "%s %% 4" % lhs, params

AutoField.register_lookup(Modulo4)

foos = Foo.filter(id__modulo4=0)
Run Code Online (Sandbox Code Playgroud)

在评估查询集时(使用foos.count()或者其他)我收到错误:

IndexError: tuple index out of range
Run Code Online (Sandbox Code Playgroud)

引用django文件.这似乎是由于模数,因为我设法使自定义转换与doc示例一起工作.

有关如何实现这一点的任何想法?

Vas*_*eev 12

我手头没有Django 1.8来测试它,但看起来你可以使用带注释的F来做到这一点,如下所示:

Foo.objects.annotate(idmod4=F('id') % 4).filter(idmod4=0)
Run Code Online (Sandbox Code Playgroud)

(Django 1.7及更早版本不支持使用F in annotate)


对于Django 1.7及更早版本,您可以随时使用,.extra()但它不是很漂亮:

Foo.objects.extra(where=["id %% %s = 0"], params=[4])
Run Code Online (Sandbox Code Playgroud)