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ステートメントに解析するときにAND演算されます。したがって、最後のクエリでは、これを(英語で)行っています。

受信者として「p2」のメッセージを持つすべてのMessageThreadオブジェクトを取得し、それらのオブジェクトから、ステータスとして「deleted」、受信者として「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)

NB :distinct節を追加しませんでした。なぜなら、それは必ずしも順序付けでうまく機能するとは限らず、モデルで順序付けを使用したかどうかもわかりません。

于 2012-06-30T12:49:59.880 に答える