0

我正在为我的开发板软件实现“忽略的用户”功能。该功能必须隐藏由用户忽略的成员启动的线程。我决定将被忽略用户的 ID 获取到 python 列表,如果该列表不为空,则将排除添加到查询集。

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

但是,exclude 的工作方式存在问题,即“调用 filter() 并在开头添加 NOT”。在这里,过滤器产生以下 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 回答