【发布时间】:2018-06-10 05:41:44
【问题描述】:
我有以下查询集:
photos = Photo.objects.all()
我过滤掉了两个查询:
a = photos.filter(gallery__name='NGL')
b = photos.filter(gallery__name='NGA')
我将它们加在一起,它们形成了一个新的、更大的查询集:
c = a | b
确实a + b的长度等于c:
a.count() + b.count() == c.count()
>>> True
到目前为止一切顺利。然而,如果我引入 .annotate(),| 似乎不再起作用:
a = photos.annotate(c=Count('label').exclude(c__lte=4)
b = photos.filter(painting=True)
c = a | b
a.count() + b.count() == c.count()
>>> False
即使在使用.annotate() 时,如何组合查询集?请注意,查询 1 和 2 都按预期单独工作,只有在使用 | 组合它们时才会出现问题。
【问题讨论】:
-
我相信您在 django 错误跟踪器 code.djangoproject.com/ticket/26019 上遇到了一张公开的票证
-
@Jason 好像是这样。谢谢,我找不到票了。
-
查看差异的一种方法是检查 SQL。您可以打印在 django 中执行的查询。例如,
c = a | b和print(c)将显示 Django 生成的 SQL。然后,您可以在 shell 中运行查询并找出差异以查看为什么会发生问题。