2010-01-31 7 views
11

Für ein Modell wie:QuerySet für nicht leer TextField-

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

Ich versuche, eine einfache queryset für alle Einzelteile zu tun, wo das „Notizen“ Feld nicht leer ist. Nicht zu finden Erwähnung dieser Fähigkeit in der Dokumentation, sondern über einen Kommentar auf einem Fehlerbericht entdeckt, dass Sie tatsächlich mit mehr vergleichen können als:

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

Dies funktioniert, fühlt sich aber wie ein Hack. "Größer als" scheint für numerische Vergleiche verwendet zu werden, nicht um zu prüfen, ob ein Textfeld leer ist. Überrascht nicht, etwas zu finden wie:

Item.objects.exclude(notes=blank) 

Bin ich mit Blick auf etwas, oder ist .filter (notes__gt = ‚‘) der richtige Weg, es zu tun?

+0

In einigen Fällen ist es auch wert Filterung von Textlänge unter Berücksichtigung, zum Beispiel, wenn es wahrscheinlich, dass Ihr Textfeld ist besteht nur aus Leerzeichen Zeichen oder HTML-Elementen: http://stackoverflow.com/questions/12314168/django-filter-on-the-basis-of-text-length –

Antwort

24

.exclude(notes=u'')

Lesen Sie mehr hier: django.db.models.query.QuerySet.exclude

+0

Ah, viel besser, danke. Ich merke das funktioniert entweder mit oder ohne das "u" vor den Zitaten. Was bewirkt das "du"? – shacker

+1

Das 'u' vor dem String macht es zu einem' Unicode'-Literal. Es wird hier nicht viel erreicht, da das leere "str" ​​trivial zum leeren "Unicode" dekodiert. Es spart ein kleines bisschen Zeit, aber nicht genug, um sich wirklich Sorgen zu machen. Ich benutze Unicode-Literale dort immer, weil Django intern Unicode verwendet, und wenn etwas Nicht-ASCII auftaucht, dann wollen Sie nicht, dass Django daran erstickt, weil Sie mit einem einzigen Tastendruck gecrimpt haben. –

+0

Verstanden, vielen Dank. – shacker

1

Sie auch Q-Objekt verwenden können:

from django.db.models import Q 
Item.objects.filter(~Q(notes='')) 
Verwandte Themen