首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django queryset的Modulo?

在django queryset的Modulo?
EN

Stack Overflow用户
提问于 2015-05-18 15:38:07
回答 1查看 2.8K关注 0票数 13

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

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

这是我的代码:

代码语言:javascript
复制
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)

当对查询集进行评估时(使用foos.count()或其他方法),我会得到一个错误:

代码语言:javascript
复制
IndexError: tuple index out of range

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

你知道怎么做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-18 15:57:40

我手头没有Django 1.8来测试它,但是看起来您可以使用F带注释进行测试,如下所示:

代码语言:javascript
复制
Foo.objects.annotate(idmod4=F('id') % 4).filter(idmod4=0)

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

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

代码语言:javascript
复制
Foo.objects.extra(where=["id %% %s = 0"], params=[4])
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30307421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档