Django过滤/排除给出了错误的结果,为什么?

时间:2012-06-09 23:11:39

标签: python django django-models

我有一个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)

2 个答案:

答案 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条款,因为它不一定适用于订购,我不知道你在模型中使用了什么。