我有一个如下模型:
class Car(models.Model):
make = models.CharField(max_length=40)
mileage_limit = models.IntegerField()
mileage = models.IntegerField()
我想选择里程数小于mileage_limit的所有汽车,因此在SQL中,它将类似于:
select * from car where mileage < mileage_limit;
使用Django中的Q对象,我知道我可以用任何值/对象来比较列,例如,如果我想得到里程数少于100,000的汽车,它会是这样的:
cars = Car.objects.filter(Q(mileage__lt=100000))
我希望使用列名而不是固定值(在我的例子中,它是mileage_limit)。因此,我希望能够执行如下操作:
cars = Car.objects.filter(Q(mileage__lt=mileage_limit))
但是这会导致一个错误,因为它需要的是一个值/对象,而不是列名。有没有一种方法可以使用Q对象来比较两列?我觉得这是一个非常常用的特性,应该有一种简单的方法来做这件事,但是在文档中找不到任何关于它的内容。
- 注意:这是一个简化的示例,似乎没有必要使用Q对象。但是真实的模型中的列更多,实际查询也更复杂,这就是为什么我使用Q的原因。在这个问题中,我只是想具体了解如何使用Q比较列。*
编辑
显然在Django 1.1发布后,可以做以下事情:
cars = Car.objects.filter(mileage__lt=F('mileage_limit'))
仍然不确定F是否应该像这样与Q一起工作:
cars = Car.objects.filter(Q(mileage__lt=F('mileage_limit')))
2条答案
按热度按时间b1uwtaje1#
如果没有自定义的SQL,你现在无法做到这一点。django开发人员正在开发一个F()函数,它将使这成为可能:#7210 - F()语法,需要设计反馈。
q3qa4bjr2#
由于我必须根据已接受的答案来查找这个表达式,因此我想快速说明一下,
F()
表达式确实已经发布,并且可以在查询中使用。这是
F()
上的Django文档中的描述:F()对象表示模型字段的值、模型字段的转换值或带注解的列,它使得引用模型字段值并使用它们执行数据库操作成为可能,而实际上不必将它们从数据库中提取到Python内存中。
相反,Django使用F()对象生成一个SQL表达式来描述数据库级的操作。
使用
F()
进行查询的参考也提供了有用的示例。