2010-01-31 19 views
11

dla modelu jak:QuerySet dla niepustego TextField

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

ja próbuje zrobić prosty queryset dla wszystkich elementów, gdzie „notatki” pole jest niepusty. Nie znajdując wzmianki o tej możliwości w docs, ale poprzez komentarzu do raportu o błędzie, odkrył, że rzeczywiście można porównać z większą niż:

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

To działa, ale czuje się jak hack. "Większy niż" wydaje się być użyty do porównań liczbowych, a nie do sprawdzenia, czy pole tekstowe jest puste. nie zaskoczony, aby znaleźć coś takiego:

Item.objects.exclude(notes=blank) 

Am I widokiem na coś, lub jest .filter (notes__gt = '') we właściwy sposób to zrobić?

+0

W niektórych przypadkach jest to również warto zastanowić się filtrując przez długość tekstu, na przykład jeśli jest to prawdopodobnie Twoja textfield składa się tylko ze znaków białych znaków lub elementów html: http://stackoverflow.com/questions/12314168/django-filter-on-the-basis-of-text-length –

Odpowiedz

24

.exclude(notes=u'')

Czytaj więcej tutaj: django.db.models.query.QuerySet.exclude

+0

Ach, znacznie lepiej, dziękuję. Zauważam, że działa to z lub bez "u" przed cytatami. Co więc robi "u"? – shacker

+1

'u' przed ciągiem czyni go literałem' unicode'. Nie osiąga tutaj zbyt wiele, ponieważ pusty 'str' dekoduje się do pustego' unicode' trywialnie. Oszczędza to trochę czasu, ale nie na tyle, aby naprawdę się martwić. Używam tam literałów w standardzie Unicode, ponieważ Django używa wewnętrznie unicodu, a jeśli pojawi się coś innego niż ASCII, nie chcesz, żeby Django się dusił, ponieważ za jednym naciśnięciem klawisza. –

+0

Mam to, dziękuję bardzo. – shacker

1

można również użyć Q obiektu:

from django.db.models import Q 
Item.objects.filter(~Q(notes='')) 
Powiązane problemy