是否已经有一种方法可以根据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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1258 次  |  
        
|   最近记录:  |