Django - 使用 Q 跨越空关系的查询集

发布于 2024-07-26 10:52:05 字数 826 浏览 8 评论 0原文

考虑模型:

#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'))

我看到的问题是“|” 这就是应用的。 A 类和 B 类的两个不同查询集工作正常。 有什么方法可以应用单个查询集来完成这项工作吗? 或者更糟糕的是,一种合并各个查询集的方法。

Consider the models:

#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)

When I create objects of C, I ensure that an object has EITHER a classA or classB relationship.

I am looking for a single queryset, which gets me objects of C for specific fieldOfA or specific fieldOfB values.

I tried this, but it fails (returns [], despite there being valid results).

#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'))

The problem I see is the '|' that is the applied. Two different querysets for classA and classB work fine. Any way I could apply a single queryset to make this work? Or worse, a way to merge the individual querysets.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

恬淡成诗 2024-08-02 10:52:05

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

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

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

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

What do you see?

If you can be sure that a C either has an A or a B but never both, your isnull constraints are redundant. What happens if you run the following?

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

If that still doesn't work, run manage.py shell and after running the above query (ensuring that settings.DEBUG is True, check the generated SQL for the above with

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

What do you see?

寻找一个思念的角度 2024-08-02 10:52:05

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

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

Actually, you can combine QuerySets in the same way. Like so:

C.objects.filter(classA__fieldOfA='foo') | C.objects.filter(classB__fieldOfB='foo')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文