2009-07-10 47 views
2

的QuerySet跨越零關係考慮車型:Django的 - 用品質

#Models 
class A(models.Model): 
    fieldOfA = models.CharField(max_length = 4) 
class B(models.Model): 
    fieldOfB = models.CharField(max_length = 4) 
class C(models.Model): 
    classA = models.ForeignKey(A, blank=True, null=True) 
    classB = models.ForeignKey(B, blank=True, null=True) 

當我創建C的對象,我保證一個對象或者是CLASSA或ClassB的關係。

我正在尋找一個單獨的查詢集,它爲特定的fieldOfA或特定的fieldOfB值獲取C的對象。

我試過這個,但是失敗了(返回[],儘管存在有效的結果)。

#Views - assume double underscore in the query 
from django.db.models import Q 
my_query = C.objects.filter(Q(classA _ _isnull = False, classA _ _fieldOfA = 'foo') | Q(classB _ _isnull = False, classB _ _fieldOfB = 'foo')) 

我看到的問題是'|'那是應用的。 classA和classB的兩個不同的查詢集工作正常。任何方式,我可以申請一個單一的查詢集,使其工作?或者更糟糕的是,合併單個查詢集的方法。

回答

2

如果您可以確定C或者A或B但都不是兩者,那麼您的約束是多餘的。如果你運行以下操作會發生什麼?

C.objects.filter(Q(classA__fieldOfA = 'foo') | Q(classB__fieldOfB = 'foo')) 

如果仍然無法正常工作,運行manage.py shell和運行上面的查詢後(確保settings.DEBUGTrue,檢查生成的SQL對於以上

>>> from django.db import connection 
>>> connection.queries() 

你看到了什麼?

+0

不幸的是,消除冗餘並沒有幫助。 SQL有兩個'LEFT OUTER JOINS'(Q內部後跟INNER JOIN)。第二個Q不應該有RIGHT OUTER JOIN? fieldB值不會被恢復。 感謝您的幫助。我現在正在鏈接(以某種方式合併)兩個查詢集,這也適用於我。使用這段代碼 - http://www.djangosnippets.org/snippets/1103/ – tjazz 2009-07-14 11:11:30

2

其實,你可以以同樣的方式結合QuerySet s類似於這樣:

C.objects.filter(classA__fieldOfA='foo') | C.objects.filter(classB__fieldOfB='foo')