[pyar] django Q

fisa fisadev en gmail.com
Vie Ago 5 11:25:57 ART 2011


2011/8/5 Daniel <dmlistapython en gmail.com>:
> Hola Gente linda:
>
> teniendo en cuenta este código
>
> def nuevaQ(valor, filtro="__icontains"):
>      campo="titulo"
>      rset = Q(campo+filtro=valor) **
>
> dado que Q no recibe string como nombre del parámetro
> ¿cómo puedo hacer para que el campo y el filtro** provengan de una variable?
>
> Espero que se entienda
>
> --
> Daniel Malisani

Buenas! te vuelvo a responder acá, para que le sirva también al resto
de la gente.

Varias cosas

1) no necesitás usar Q(), lo que querés armar es simple y se puede
hacer con filters.
2) varias condiciones en un filter es equivalentes a ands en la query
3) podés "desarmar" un diccionario para pasarlo como parámetros a una
función con **
4) podés concatenar filters, y es lo mismo que poner varios campos en
un filter, es decir que se arman con ands en la query sql

Con esas cosas:

def hacer_filtros(frase, campos):
    filtros = dict((c + '__icointains', p)
                      for p in frase.split()
                      for c in campos)
    return Modeloxx.objects.filter(**filtros)

o si querés pasarle el query set como parámetro:

def hacer_filtros(qs, frase, campos):
    filtros = dict((c + '__icointains', p)
                      for p in frase.split()
                      for c in campos)
    return qs.filter(**filtros)

Otra cosa aparte:
En lo que vos hacías hay algo que nunca andaría, que es esto:
Q(campo+filtro=valor)
Nunca podés hacer ese "campo+valor" en la parte izquierda de un
parámetro de algo. La parte izquierda es un nombre, y no "algo que
devuelva un nombre".
Es lo mismo que si intentases hacer esto:
a+b = 8
Fijate que en ese ejemplo es bien obvio, no podés hacer una asignación
así porque python nunca sabría a qué se lo tiene que asignar.
Bueno, los parámetros funcionan igual. Llamar a funcionx(par1=valor1)
es llamar a funcionx, y asignarle a par1 el valor1.
Para cuando necesitás armar los nombres de parámetros dinámicamente,
tenés ese truco de pasar un diccionario con ** adelante :)

Saludos!

-- 
fisa  -  Juan Pedro Fisanotti



More information about the pyar mailing list