0

ボード ソフトウェアに「無視されたユーザー」機能を実装しています。その機能は、ユーザーが無視するメンバーによって開始されたスレッドを非表示にする必要があります。無視されたユーザーの ID を Python リストに取得し、そのリストが空でない場合は、クエリ セットに除外を追加することにしました。

if ignored_users:
    queryset_threads = queryset_threads.exclude(start_poster_id__in=ignored_users)

ただし、「filter() を呼び出して、先頭に NOT を追加する」という、exclude の動作に問題があります。ここで、フィルターは次の SQL を生成します。

`threads_thread` . `start_poster_id` IN (2, 3, 4, 5) AND `threads_thread` . `start_poster_id` NOT NULL

NOT NULL を取り除くにはどうすればよいですか? アカウントを削除したメンバーが投稿したスレッドは、「start_poster_id」列に NULL が含まれています。

4

1 に答える 1

0

投稿した生の SQL は正しくないようです。書かれているように、実際には無効です。は何の値NOT NULLですか?

とにかく、NULLは から追加されません.exclude()。コードの別の場所から追加する必要があります。

.exclude()指定したパラメーターに追加WHERE NOTするだけで、独自のパラメーターは追加しません。

ここで .exclude() のドキュメントを参照してください。

例えば:

>>> query = Threads.objects.exclude(id__in=[1,2,3,4]).query.__str__()
>>> query
'SELECT `test_threads`.`id`, `test_threads`.`threads_name` 
FROM `test_threads` 
WHERE NOT (`test_threads`.`id` IN (1, 2, 3, 4))'

queryset_threadsフィルタリングの最初の割り当てはNOT NULLですか? これに似ています:

>>> query = Threads.objects.filter(id__isnull=False)
>>> query = query.exclude(id__in=[1,2,3,4]).query.__str__()
>>> query
'SELECT `test_threads`.`id`, `test_threads`.`threads_name` 
FROM `test_threads` 
WHERE (`test_threads`.`id` IS NOT NULL 
AND NOT (`test_threads`.`id` IN (1, 2, 3, 4)))'
于 2013-01-29T02:07:47.850 に答える