2015-02-06 2 views
1

Я пытаюсь запросить базу данных и исключить некоторые строки, содержащие некоторые из некоторых укусов.Продвинутый запрос ORM Django с operator.or_ не выполняется Нет Значения

Моя упрощенная модель выглядит следующим образом:

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

Вы можете использовать и условие 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 и TextField, потому что пустые строковые значения будут всегда сохраняются как пустые строки , а не как NULL.

+0

Спасибо @danihp, я просто попробовал, и это сработало, как и ожидалось. Также спасибо за подсказку, не использующую 'null = True'. Я окончательно буду помнить об этом. Всегда рады узнать новые шаблоны python/django. –

Смежные вопросы