¿Manera más clara de consultar en un número dinámico de columnas en Django?

votos
0

En mi caso, tengo varios nombres de columna procedentes de un formulario. Quiero filtrar para asegurarme de que todos sean ciertos. Así es como lo hago actualmente:

for op in self.cleaned_data['options']:
    cars = cars.filter((op, True))

Ahora funciona, pero hay unas posibles ~ 40 columnas para probar y, por lo tanto, no parece muy eficiente seguir consultando.

¿Hay alguna manera de condensar esto en una consulta de filtro?

Publicado el 09/12/2008 a las 18:00
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
9

Cree la consulta como un diccionario y use el operador ** para descomprimir las opciones como argumentos de palabra clave en el método de filtro.

op_kwargs = {}
for op in self.cleaned_data['options']:
    op_kwargs[op] = True
cars = CarModel.objects.filter(**op_kwargs)

Esto está cubierto en la documentación de django y también se ha cubierto en SO .

Respondida el 09/12/2008 a las 18:37
fuente por usuario

votos
3

Los conjuntos de consultas de Django son flojos, por lo que lo que estás haciendo actualmente es bastante eficiente. La base de datos no se golpeará hasta que intente acceder a uno de los campos en QuerySet ... suponiendo, es decir, que no haya editado algún código, y efectivamente es así:

cars = CarModel.objects.all()
for op in self.cleaned_data['options']:
    cars = cars.filter((op, True))

Más información aquí .

Respondida el 09/12/2008 a las 21:57
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more