2010-01-31 3 views
11

Для модели, как:QuerySet для непустого TextField

class Item(models.Model): 
    notes = models.TextField(blank=True) 
    .... 

Я пытаюсь сделать простой QuerySet для всех предметов, где поле «Примечания» не пусто. Не найдя упоминаний о такой возможности в документации, но через комментарии к сообщению об ошибке, обнаружил, что вы можете сравнить с более чем:

items_with_notes = Item.objects.filter(notes__gt='') 

Это работает, но чувствует, как взломать. «Больше чем» похоже, что он должен использоваться для числовых сравнений, а не для проверки того, пустое ли текстовое поле. Удивление не найти что-то вроде:

Item.objects.exclude(notes=blank) 

ли я с видом что-то, или .filter (notes__gt = «») правильный способ сделать это?

+0

В некоторых случаях это также стоит рассматривать фильтрации по длине текста, например, если он, скорее всего, ваш TextField состоит только из символов пробелов или элементов html: http://stackoverflow.com/questions/12314168/django-filter-on-the-basis-of-text-length –

ответ

24

.exclude(notes=u'')

Подробнее здесь: django.db.models.query.QuerySet.exclude

+0

А, намного лучше, спасибо. Я замечаю, что это работает либо с или без «u» перед кавычками. Итак, что делает «u»? – shacker

+1

'u' перед строкой делает это' unicode' литералом. Здесь этого не очень много, так как пустая 'str' декодирует пустой' unicode' тривиально. Это позволяет сэкономить немного времени, но этого недостаточно, чтобы действительно волноваться. Я использую литералы unicode всегда, потому что Django использует unicode внутри, и если что-то не-ASCII появляется, вы не хотите, чтобы Django задыхался, потому что вы нажимали на одно нажатие клавиши. –

+0

Получил, спасибо большое. – shacker

1

вы также можете использовать Q объект:

from django.db.models import Q 
Item.objects.filter(~Q(notes='')) 
Смежные вопросы