2014-10-11 101 views
2

我有一個Django查詢集,我必須使用.extra(select=)方法,因爲我計算的字段需要WHERE語句子過濾器。從Django Q()對象獲取查詢

我在很多地方使用這個WHERE子句,我想要遵守DRY(在編寫原始SQL時通常有點困難)。我用Django的Q()對象編寫了一個聲明,我可以重用並添加到原始SQL中。

我知道你可以這樣做Queryset.query.__str__()以獲得等效的SQL輸出 - 有沒有辦法用Q對象做到這一點?

+0

在文檔中它說'QuerySet.query'爲您提供原始SQL嗎? – 2014-10-12 00:09:27

+0

對不起,我應該已經更清楚了 - 'QuerySet.query'作爲一個命令並沒有做任何事情,但是如果你有一個查詢集,你可以調用'.query .__ str __()'並且返回SQL語句。 「'QuerySet'」我只是用作佔位符。 – jdotjdot 2014-10-12 01:09:10

回答

0

嘗試使用一個單一的過濾器做一個簡單的查詢是這樣的:

from django.db.models import Q 
from django.contrib.auth.models import User 

print str(User.objects.filter(~Q(is_active=True)).query) 

你就可以明白是Q做什麼。

+0

我確實瞭解'Q'做了什麼,問題是'Q'上有一個未公開的方法,可以在查詢集上調用'.filter()'時生成SQL'WHERE'語句。我想我必須深入到源中才能找到答案。 – jdotjdot 2014-10-12 19:54:34

+0

Q它是一個在過濾方法中使用的對象,我從來沒有找到一種單獨輸出查詢的方式,對不起。 – 2014-10-13 04:52:42