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

2024-09-28 23:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: djangofromidmessageobjectsstatusfilterwhere
2条回答

未测试(显然,因为我没有在本地安装您的项目),但这应该可以:

exclude_ids = Message.objects.filter(
    status="deleted", recipient_id=4
    ).values_list("thread_id", flat=True)
MessageThread.objects.exclude(id__in=exclude_ids)

注意:我没有添加distinct子句,因为它不一定适用于排序,而且我不知道您是否在模型中使用了排序。你知道吗

在exclude或filter参数中放置的查找在解析为SQL语句时被AND。因此,在您上次的查询中,您正在这样做(用英语):

Give me all the MessageThread objects that have a message with "p2" as recipient and from those objects, quit all messages that have "deleted" as status and "p2" as a recipient.

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

编辑好的,现在我知道你需要什么了。所以你基本上只需要你的问题的排除部分。我想你需要这个:

MessageThread.objects.exclude(message__status='deleted', message__recipient_id=4)

相关问题 更多 >