2

考虑模型:

#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 的两个不同查询集工作正常。有什么方法可以应用单个查询集来完成这项工作吗?或者更糟的是,一种合并单个查询集的方法。

4

2 回答 2

2

如果您可以确定一个 C 有一个 A 或一个 B 但从不同时有一个,那么您的isnull约束是多余的。如果您运行以下命令会发生什么?

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

如果这仍然不起作用,请运行manage.py shell并在运行上述查询之后(确保即settings.DEBUG检查True生成的 SQL 与

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

你看到了什么?

于 2009-07-11T09:29:12.337 回答
2

实际上,您可以以相同的方式组合QuerySets。像这样:

C.objects.filter(classA__fieldOfA='foo') | C.objects.filter(classB__fieldOfB='foo')
于 2009-07-11T12:56:37.387 回答