2015-05-18 71 views
4

在django queryset中,是否有一種方法可以根據id % 4 == 0選擇對象?在django queryset中模數?

到目前爲止,我發現的唯一解決方案是編寫自定義轉換,因爲modulo似乎在Postgresql中受支持,但是出現錯誤。

這裏是我的代碼:

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()或其他):

IndexError: tuple index out of range 

指的Django的文件。這似乎是由於我設法使自定義轉換與doc example一起工作而導致的。

有關如何實現這一點的任何想法?

回答

5

我沒有Django的1.8手頭測試,但看起來你可以做到這一點使用F with annotation,像這樣:

Foo.objects.annotate(idmod4=F('id') % 4).filter(idmod4=0) 

(Django的1.7和更早的版本不支持使用的F annotate


Django的1.7和更早的版本,你可以隨時使用.extra(),但它是不是很漂亮:

Foo.objects.extra(where=["id %% %s = 0"], params=[4]) 
+0

不幸的是,我用django 1.7 :(:(應該指定它在問題中) – stellasia

+0

@stellasia更新了我的答案,只有Django 1.7的可用方法 –

+0

似乎不能使用%d參數,但我可以做到這一點沒有選擇。 非常感謝! – stellasia