2009-07-10 49 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')