2010-01-31 12 views
11

Para un modelo como:QuerySet de campo de texto no vacío

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

que estoy tratando de hacer un conjunto de consultas simple para todos los Elementos en los que el campo "notas" no está vacío. Al no encontrar mención de esta capacidad en los documentos, sino a través de un comentario en un informe de error, descubrió que en realidad se puede comparar con el mayor de:

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

Esto funciona, pero se siente como un truco. "Más grande que" parece que debería usarse para comparaciones numéricas, no para verificar si un campo de texto está en blanco. Sorprendió no encontrar algo como:

Item.objects.exclude(notes=blank) 

estoy pasando por alto algo, o es .Filter (notes__gt = '') de la manera correcta de hacerlo?

+0

En algunos casos, también vale la pena considerar filtrado por la longitud del texto, por ejemplo si es probable que su campo de texto consiste solo de caracteres en espacios en blanco o elementos html: http://stackoverflow.com/questions/12314168/django-filter-on-the-basis-of-text-length –

Respuesta

24

.exclude(notes=u'')

Leer más aquí: django.db.models.query.QuerySet.exclude

+0

Ah, mucho mejor, gracias. Observo que esto funciona con o sin la "u" antes de las comillas. Entonces, ¿qué hace la "u"? – shacker

+1

La 'u' delante de la cadena lo convierte en un literal 'unicode'. No logra mucho aquí, ya que el 'vacío' vacío decodifica el' unicode' vacío trivialmente. Ahorra un poco de tiempo, pero no lo suficiente como para preocuparse realmente. Utilizo siempre literales unicode porque Django usa el Unicode internamente, y si aparece algo que no es ASCII, entonces no quiere que Django se ahogue porque ha limitado un solo golpe de teclado. –

+0

Entendido, muchas gracias. – shacker

1

también se puede utilizar Q objeto:

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