我正在为我的主板软件实现“忽略用户”功能。该功能必须隐藏成员用户忽略启动的线程。我已经决定将被忽略的用户的ID提取到python列表,如果该列表不为空,则将exclude添加到查询集。
if ignored_users:
queryset_threads = queryset_threads.exclude(start_poster_id__in=ignored_users)
但是,排除工作方式存在问题,即“调用filter()并在开头添加NOT”。这里,filter生成以下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。
答案 0 :(得分:0)
您发布的原始SQL似乎不正确。它实际上是无效的。什么价值是NOT NULL
?
无论如何,NULL
未添加.exclude()
。它必须从代码中的其他位置添加。
.exclude()
只是将WHERE NOT
添加到您指定的参数中 - 它不会添加它自己的参数。
See the docs for .exclude() here.
例如:
>>> 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)))'