0

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

2 回答 2

0

您放在排除或过滤参数中的查找在解析为 SQL 语句时会进行与运算。因此,在您的最后一个查询中,您正在执行此操作(英文):

给我所有具有“p2”作为收件人的消息的 MessageThread 对象,并从这些对象中退出所有“已删除”作为状态和“p2”作为收件人的消息。

所以基本上,你排除了你过滤的东西。如果您想获取所有以“p2”为收件人但未被删除的邮件,您可以执行以下操作:

编辑好的,现在我明白你需要什么了。所以你基本上只想要你的问题的查询的排除部分。我认为你需要这个:

MessageThread.objects.exclude(message__status='deleted', message__recipient_id=4)
于 2012-06-09T23:50:58.897 回答
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子句,因为它不一定适用于排序,而且我不知道您是否在模型中使用了排序。

于 2012-06-30T12:49:59.880 回答