2009-04-20 15 views
30

¿Cómo creo un filtro "AND" para recuperar objetos en Django? Por ejemplo, me gustaría recuperar una fila que tiene una combinación de dos palabras en un solo campo.¿Cómo uso AND en un filtro de Django?

Por ejemplo, la siguiente consulta SQL que hace exactamente cuando lo ejecuto en la base de datos MySQL:

select * from myapp_question 
where ((question like '%software%') and (question like '%java%')) 

¿Cómo se logra esto en Django usando filtros de búsqueda?

Respuesta

59
mymodel.objects.filter(first_name__icontains="Foo", first_name__icontains="Bar") 

actualización: Hace tiempo que no escribo esta respuesta y de hecho algunas de Django, pero estoy seguro de que este día el mejor enfoque consiste en utilizar el método de objeto Q como David Berger muestra aquí: stackoverflow.com/ a/770078/63097

+3

Esto no funciona para mí en Django 1.6 y Postgres. Obtengo un "argumento SyntaxError: palabra clave repetida" cuando hay dos o más palabras clave iguales. Solo funciona la solución con Q de David Berger. – margusholland

+0

@margusholland La respuesta me funciona con Django 1.6 y Postgres. ¿Puedes publicar tu consulta? Es tan oficial como el método del objeto Q. https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships – Medorator

+1

Tengo un modelo de país con un código de país corto (cc_short): >>> países = Country.objects.filter (cc_short__icontains = 'A', cc_short__icontains = 'B') Archivo "", línea 1 SintaxisError: argumento de palabra clave repetido – margusholland

10

se pueden encadenar expresiones de filtro en Django:

q = Question.objects.filter(question__contains='software').filter(question__contains='java') 

puede encontrar más información en la documentación de Django en "Chaining Filters".

+2

Esta respuesta puede arrojar resultados incorrectos según su situación. El uso de filtros ',' en filtro frente a encadenamiento puede tener diferentes resultados. Lectura adicional: [SO Answer] (http://stackoverflow.com/a/11025652/781695) y [Documentos oficiales] (https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning -multi-valued-relationships) – Medorator

57

Por el amor minuciosidad, vamos a mencionar el método Q objeto:

from django.db.models import Q 
criterion1 = Q(question__contains="software") 
criterion2 = Q(question__contains="java") 
q = Question.objects.filter(criterion1 & criterion2) 

Nota las otras respuestas aquí son más simples y mejor adaptado para su caso de uso, pero si cualquier persona con un problema similar pero ligeramente más complejo (tales como necesitar "no" o "o") ve esto, es bueno tener la referencia aquí.

+0

¡Muy interesante! –

+0

Solo quería mencionar que su comentario de aprobación me ayudó. ¡Gracias! – Alfonsol

Cuestiones relacionadas