2012-06-09 45 views
0

我有一个django查询,它给了我一个错误的查询集。从下面的个人查询中,它应该给我1 - 0 = 1,但它会给我0结果。这是为什么?Django过滤器/排除错误的结果,为什么?

>>> 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

你把里面的查找一个排除或者当他们解析SQL语句过滤器参数进行逻辑与运算。所以,在你最后一次查询你正在做这个(英文):

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

所以基本上,你不包括你过滤的东西。如果你想得到所有带有“p2”的邮件作为未被删除的收件人,你可以这样做:

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

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

是的,所以我尝试了这一点,它不会产生正确的结果,因为它没有足够的限制,它会排除已经被另一个用户删除的消息,但不包括当前用户。我可以弄清楚这一点的唯一方法是用下面的SQL:'SELECT * FROM messaging_messagethread WHERE id NOT IN(SELECT DISTINCT thread_id FROM messaging_message WHERE status ='deleted'AND recipient_id = 4)' – David542

+0

我认为有一个区别你在你的问题中提出的SQL以及你在评论中所说的内容。你的“消息”模型中的“收件人”字段是什么意思?因为它似乎不是删除该消息的用户。你确定你的SQL是你需要的吗?如果是这样,我的答案应该适合您的需要。否则,请尝试在此处添加模型并用英文写入您希望从查询中获得的内容。 – marianobianchi

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条款,因为它不一定适用于排序,我不知道您在模型中使用的顺序。

相关问题