2011-07-02 15 views
10

¿Cómo vería si un valor está en un QuerySet?Cómo ver si un valor u objeto está en un campo QuerySet

Por ejemplo, si tengo el siguiente modelo:

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    first_name = models.CharField(max_length=50) 

¿Cómo voy a saber si el nombre 'David' está contenida en un QuerySet? Una forma de hacer lo siguiente:

ld = UserProfile.objects.filter(...).values('first_name') 
    >>> for object in ld: 
    ...  if object['first_name'] =='David': 
    ...    print True 

O si un objeto de usuario en particular es en su lugar? Algo así como 'David' in QuerySet['first_name']? Gracias.

manera
+2

¿Por qué no hacer que en 'filter()'? –

Respuesta

26

más simple es utilizar el método de la gerente get:

try: 
    foo = Foo.objects.get(foo_name='David') 
except Foo.DoesNotExist: 
    print 'Nope' 
except Foo.MultipleObjectsReturned: 
    print 'Filter is a better choice here' 

exists El método es aplicable también, si no es necesario para obtener el objeto:

if Foo.objects.filter(foo_color='green').exists(): 
    print 'Nice' 

Si Ya tiene el objeto y desea determinar si está contenido en un conjunto de consulta:

foo = Foo.objects.get(foo_name='David') 
qs = Foo.objects.filter(<criteria>) 
if foo in qs: 
    print 'Nice again' 

Si desea utilizar un valor en lugar de un objeto:

value = 'David' 
qs = Foo.objects.filter(<criteria>).values_list('foo_name',flat=True) 
if value in qs: 
    print 'Nice' 
+1

gracias esto es realmente útil. Un par de preguntas: 1) ¿cuál es la diferencia entre usar 'if Foo.objects.filter (...):' y 'if Foo.objects.filter (...). Exists()' - is '. Existe() 'sustancialmente más rápido? 2) ¿Qué hace 'flat = True' do/why lo usarías en los criterios' .values ​​() '? Gracias. – David542

+0

1) Filtro devuelve un conjunto de interrogación, existe devuelve verdadero o falso en función de si el conjunto de consulta tiene algún registro o no. 2) Si es plano = Verdadero, el método de valores devuelve una lista de elementos individuales; de lo contrario, devuelve una lista de tuplas. Para más detalles, puede consultar la excelente documentación de queryset. – shanyu

+0

ok gracias. Miré los documentos e hice algunas pruebas y es '.values_list()' que devuelve una lista de tuplas o una lista de elementos individuales si 'flat = True'. .values ​​() no ofrece 'flat = True' (Miré los documentos cuando recibí un mensaje de error). – David542

Cuestiones relacionadas