2012-06-09 3 views
0

У меня есть запрос django, который дает мне ошибочный запрос. Из следующих отдельных запросов он должен дать мне 1 - 0 = 1, но вместо этого он дает мне 0 результатов. Почему это так?Django filter/exclude дает ошибочный результат, почему?

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

В поисках вы положили внутри исключить или аргументы фильтра, когда операция AND разобрать на заявления SQL. Так, в последнем запросе вы делаете это (на английском языке):

Дайте мне все объекты MessageThread, которые имеют сообщение с «p2» в качестве получателя и от тех объектов, закройте все сообщения, которые «удаленные» как статус и «p2» в качестве получателя.

Так что в основном вы исключаете, что фильтруете. Если вы хотите получить все сообщения с «p2» в качестве получателя, которые не удалены, вы можете сделать это:

EDIT Хорошо, теперь я понимаю, что вам нужно. Поэтому вы в основном хотите исключить часть запроса по вашему вопросу. Я думаю, что вам это нужно:

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

Yup, поэтому я пробовал это, и он не дает правильных результатов, поскольку он не является достаточно ограничительным, он исключает сообщения, которые были удалены другим пользователем, но не текущим пользователем. Единственный способ понять это - со следующим 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) 

NB: Я не добавлял distinct потому что это не обязательно хорошо работает с заказом, и я не знаю, как вы использовали заказ в своих моделях.

Смежные вопросы