[Python-es] Busqueda compleja en BD

gabriel fernandez gabofer82 en gmail.com
Jue Jun 28 18:30:21 CEST 2012


Excelente, muchisimas gracias César, la verdad que a veces uno se limita mas
por no conocer el lenguaje que por no conocer el framework.

Saludos!

El 28 de junio de 2012 13:04, César H. Roldán <croldan en gmail.com> escribió:

> 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/
>>
>>
>
> _______________________________________________
> 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120628/02658987/attachment.html>


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