queryset query filtros example consultas avanzadas python django orm

python - query - filtros en django



ComparaciĆ³n de columnas en consultas de Django (1)

Tengo un siguiente modelo:

class Car(models.Model): make = models.CharField(max_length=40) mileage_limit = models.IntegerField() mileage = models.IntegerField()

Quiero seleccionar todos los coches en los que el kilometraje sea inferior a kilometraje_límite, por lo que en SQL sería algo así como:

select * from car where mileage < mileage_limit;

Utilizando el objeto Q en Django, sé que puedo comparar columnas con cualquier valor / objeto, por ejemplo, si quisiera obtener automóviles con un kilometraje inferior a 100.000, sería algo así como:

cars = Car.objects.filter(Q(mileage__lt=100000))

En lugar de un valor fijo, me gustaría utilizar el nombre de la columna (en mi caso, es kilometraje_límite). Entonces me gustaría poder hacer algo como:

cars = Car.objects.filter(Q(mileage__lt=mileage_limit))

Sin embargo, esto genera un error, ya que está esperando un valor / objeto, no un nombre de columna. ¿Hay alguna forma de comparar dos columnas usando el objeto Q? Siento que sería una característica muy común y debería haber una manera fácil de hacerlo, pero no pude encontrar nada al respecto en la documentación.

Nota: este es un ejemplo simplificado, para el cual el uso del objeto Q podría ser innecesario. Sin embargo, el modelo real tiene muchas más columnas, y la consulta real es más compleja, es por eso que estoy usando Q. Aquí en esta pregunta solo quería averiguar específicamente cómo comparar columnas usando Q.

EDITAR

Aparentemente después del lanzamiento de Django 1.1 sería posible hacer lo siguiente:

cars = Car.objects.filter(mileage__lt=F(''mileage_limit''))

Todavía no estoy seguro si se supone que F debe funcionar junto con Q de esta manera:

cars = Car.objects.filter(Q(mileage__lt=F(''mileage_limit'')))