operator.or_ 的高级 Django ORM 查询因 None 值而失败

Advanced Django ORM query with operator.or_ fails with None Values

我正在尝试查询数据库并排除一些包含某些特定字符串之一的行。

我的简化模型如下所示:

class Message(models.model)
    text = models.TextField(blank=True, null=True)

我的查询如下所示:

import operator

ignored_patterns = ['<ignore>', ]

messages = Message.objects.exclude(
    reduce(operator.or_, (Q(text__contains=pattern) for pattern
                                                    in ignored_patterns))
)

我遇到的问题是,以某种方式包含 self.text = None 的消息也被排除在外。

感谢每一个提示。

您可以在 exclude 中使用和条件:

exclude = reduce(operator.or_, (Q(text__contains=pattern) for pattern
                                                    in ignored_patterns))
nulltext = Q(text__isnull = False)
messages = Message.objects.exclude( nulltext & exclude )

此外,阅读有关 use of null in strings 的内容:

Avoid using null on string-based fields such as CharField and TextField because empty string values will always be stored as empty strings, not as NULL.