我有一个django查询,它给了我一个错误的查询集。从以下单个查询中,它应该给我1 - 0 = 1,但它给我0结果。为什么会这样?
>>> MessageThread.objects.filter(message__recipient=p2)
[<MessageThread: message thread one>]
>>> MessageThread.objects.filter(message__status='deleted', message__recipient=p2)
[]
>>> MessageThread.objects.filter(message__recipient=p2)
.exclude(message__status='deleted', message__recipient=p2)
[]
如何构建查询以获取query1-query2?这是我在sql中所需要的:
SELECT * FROM messaging_messagethread
WHERE id NOT IN
(SELECT DISTINCT thread_id FROM messaging_message
WHERE status = 'deleted' AND recipient_id=4)
答案 0 :(得分:0)
您在排除或过滤器参数中放置的查找在解析为SQL语句时会进行AND运算。所以,在你的上一个查询中,你正在这样做(英文):
将所有带有“p2”消息的MessageThread对象作为收件人,并从这些对象中退出所有已“已删除”状态且“p2”为收件人的邮件。
所以基本上,你排除你过滤的内容。如果要将所有带有“p2”的邮件作为未删除的收件人,您可以执行以下操作:
编辑好的,现在我明白了你的需要。因此,您基本上只想在查询中排除部分问题。我想你需要这个:
MessageThread.objects.exclude(message__status='deleted', message__recipient_id=4)
答案 1 :(得分:0)
未经测试(显然,因为我没有在本地安装您的项目),但这应该有效:
exclude_ids = Message.objects.filter(
status="deleted", recipient_id=4
).values_list("thread_id", flat=True)
MessageThread.objects.exclude(id__in=exclude_ids)
注意:我没有添加distinct
条款,因为它不一定适用于订购,我不知道你在模型中使用了什么。