Django NOT IN没有NOT NULL

时间:2013-01-28 22:56:02

标签: django django-orm

我正在为我的主板软件实现“忽略用户”功能。该功能必须隐藏成员用户忽略启动的线程。我已经决定将被忽略的用户的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。

1 个答案:

答案 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)))'