使用operator.or_的高级Django ORM查询失败,无值

时间:2015-02-06 10:20:42

标签: django django-orm django-queryset

我试图查询数据库并排除某些包含某些特定行为的行。

我的简化模型如下所示:

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的消息。

我感谢每一个提示。

1 个答案:

答案 0 :(得分:1)

您可以在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

  

避免在基于字符串的字段(如CharField和)上使用null   TextField,因为空字符串值将始终存储为空   字符串,而不是NULL。