[Python-es] Busqueda compleja en BD

César H. Roldán croldan en gmail.com
Jue Jun 28 18:04:08 CEST 2012


Gabriel, si colocás la coma, tenes que tener cuidado, pero si, funciona.
Al llamar al filter, debés usar *q, no q solo porque es una tupla.
Al usar *q, estás pasandole a filter una lista de parámetros a utilizar.

Por ejemplo:

q = Q(nombre__startswith='Cesar')
# Aquí q es un Q object

q = q, Q(apellido__endswith='Roldan')
# en este momento q es una tupla

# La llamada en este caso deberías hacerla
Modelo.objects.filter(*q)

Saludo

César



El 28 de junio de 2012 12:48, gabriel fernandez<gabofer82 en gmail.com>escribió:

> César, si coloco "," (and) tambien los une?
>
>
> q = None
> for op in opciones:
>   if q is None:
>     q = Q(Modelo__contains=op)
>   else:
>     q = q , Q(Modelo__contains=op)   <===
>
>
> El 28 de junio de 2012 12:12, César H. Roldán <croldan en gmail.com>escribió:
>
>> Con el raw que te indicó Eduardo te debería servir, eso te mapea los
>> objetos y te retorna un queryset.
>>
>> Ahora, lo mejor, me parece es que en lugar de dar opciones con radio,
>> pongas checkbox, eso te puede retornar una lista de valores para un campo,
>> y con eso simplemente haces un for y vas armando objetos Q, los cuales los
>> unís con | (or)
>>
>> q = None
>> for op in opciones:
>>   if q is None:
>>     q = Q(Modelo__contains=op)
>>   else:
>>     q = q | Q(Modelo__contains=op)
>>
>> Saludo
>>
>> César
>>
>> El 28 de junio de 2012 12:01, gabriel fernandez<gabofer82 en gmail.com>escribió:
>>
>> Ok, pero yo quiero hacer un queryset, por eso uso Q, porque la consulta
>>> evalua muchas opciones, no se si las formas son excluyentes, como seria
>>> raw en una consulta con Q?
>>>
>>> El 28 de junio de 2012 11:51, Eduardo Matus <ematus en gmail.com> escribió:
>>>
>>> Tambien esta "raw"
>>>>
>>>> resultados = Modelo.objects.raw("select * from foo")
>>>>
>>>> lo que hace es que mapea las columnas a los campos del modelo, como si
>>>> fuera objetos POCO.
>>>>
>>>>
>>>> 2012/6/28 Manuel Ignacio Franco Galeano <maigfrga en gmail.com>
>>>>
>>>>> tambien esta la opcion de hacer con sql
>>>>> https://docs.djangoproject.com/en/dev/topics/db/sql/
>>>>>
>>>>>
>>>>>
>>>>>  def my_custom_sql():
>>>>>     from django.db import connection, transaction
>>>>>     cursor = connection.cursor()
>>>>>
>>>>>     # Data modifying operation - commit required
>>>>>     cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
>>>>>     transaction.commit_unless_managed()
>>>>>
>>>>>     # Data retrieval operation - no commit required
>>>>>     cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
>>>>>     row = cursor.fetchone()
>>>>>
>>>>>     return row
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> El 28 de junio de 2012 16:39, Eduardo Matus <ematus en gmail.com>escribió:
>>>>>
>>>>> primero que nada, esto no es una "consulta compleja".
>>>>>> if seleccion == 'todo':
>>>>>>     qset = ( Q(Modelo__contains='opcion1') |
>>>>>> Q(Modelo__contains='opcion2'))
>>>>>>
>>>>>> 2012/6/28 gabriel fernandez <gabofer82 en gmail.com>
>>>>>>
>>>>>>>  Hola Lista!!!
>>>>>>>
>>>>>>> Agradezco a quién me pueda dar una mano!
>>>>>>>
>>>>>>> El problema es como sigue:
>>>>>>>
>>>>>>> Tengo una busqueda en la cual uso tres radio button:
>>>>>>>
>>>>>>> Opcion 1      Opcion 2   Opcion 1-2(Ambas)
>>>>>>>
>>>>>>> En la vista cuando voy a procesar el formulario tengo algo asi
>>>>>>> (luego de validar):
>>>>>>>
>>>>>>> seleccion = form.cleaned_data['opciones']
>>>>>>> qset = (
>>>>>>>            Q(Modelo__contains=seleccion)
>>>>>>> )
>>>>>>>
>>>>>>> El problema consiste en como hacer cuando se selecciona la Opcion
>>>>>>> 1-2 ya que engloba
>>>>>>> las dos opciones anteriores, hay algo que indique que quiero todo
>>>>>>> algo tipo:
>>>>>>>
>>>>>>> qset = (
>>>>>>>            Q(Modelo__contains='todo')
>>>>>>> )
>>>>>>>
>>>>>>> Uso el modulo Q para consultas complejas porque en realidad tengo
>>>>>>> mas de una seleccion
>>>>>>> como la anterior. Muestro una solamente porque el resto son iguales,
>>>>>>> y van tambien en la misma
>>>>>>> tupla de qset.
>>>>>>>
>>>>>>> Espero ser claro.
>>>>>>>
>>>>>>> Quedo a la espera de sus opiniones y ayuda. Muchas gracias!
>>>>>>> --
>>>>>>> Gabriel Fernández
>>>>>>> Desrrollador Web
>>>>>>> www.openweb.com.uy
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Python-es mailing list
>>>>>>> Python-es en python.org
>>>>>>> http://mail.python.org/mailman/listinfo/python-es
>>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Eduardo Matus Coquelet
>>>>>> Ingeniero Civil Informático y Telecomunicaciones.
>>>>>> Celular: 77113825
>>>>>>
>>>>>> _______________________________________________
>>>>>> Python-es mailing list
>>>>>> Python-es en python.org
>>>>>> http://mail.python.org/mailman/listinfo/python-es
>>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Python-es mailing list
>>>>> Python-es en python.org
>>>>> http://mail.python.org/mailman/listinfo/python-es
>>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Eduardo Matus Coquelet
>>>> Ingeniero Civil Informático y Telecomunicaciones.
>>>> Celular: 77113825
>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> http://mail.python.org/mailman/listinfo/python-es
>>>> FAQ: http://python-es-faq.wikidot.com/
>>>>
>>>>
>>>
>>>
>>> --
>>> Gabriel Fernández
>>> Desrrollador Web
>>> www.openweb.com.uy
>>>
>>>
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> http://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> http://mail.python.org/mailman/listinfo/python-es
>> FAQ: http://python-es-faq.wikidot.com/
>>
>>
>
>
> --
> Gabriel Fernández
> Desrrollador Web
> www.openweb.com.uy
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120628/5bafe704/attachment.html>


Más información sobre la lista de distribución Python-es