Django查询中的列比较 [英] Column comparison in Django queries
问题描述
我有一个以下模型:
class Car(models.Model):
make = models.CharField(max_length=40)
mileage_limit = models.IntegerField()
mileage = models.IntegerField()
我想选择所有里程小于mileage_limit的车辆,所以在SQL中,它将是这样的:
I want to select all cars where mileage is less than mileage_limit, so in SQL it would be something like:
select * from car where mileage < mileage_limit;
在Django中使用Q对象,我知道我可以将列与任何值/对象进行比较。如果我想得到里程少于10万的汽车,那就像这样:
Using Q object in Django, I know I can compare columns with any value/object, e.g. if I wanted to get cars that have mileage say less than 100,000 it would be something like:
cars = Car.objects.filter(Q(mileage__lt=100000))
而不是固定值,我想使用列名(在我的情况下,它是mileage_limit)。所以我想要做一些如下的事情:
Instead of a fixed value I would like to use the column name (in my case it is mileage_limit). So I would like to be able to do something like:
cars = Car.objects.filter(Q(mileage__lt=mileage_limit))
然而,这会导致错误,因为它期待一个值/对象,而不是列名。有没有办法比较使用Q对象的两列?我觉得这是一个非常常用的功能,应该有一个简单的方法来做到这一点,但在文档中找不到任何东西。
However this results in an error, since it is expecting a value/object, not a column name. Is there a way to compare two columns using Q object? I feel like it would be a very commonly used feature and there should be an easy way to do this, however couldn't find anything about it in the documentation.
注意:这是一个简化的例子,使用Q对象可能是不必要的。然而,真正的模型有更多的列,真正的查询更复杂,这就是为什么我使用Q.在这个问题中,我只是想弄清楚如何比较使用Q的列。
编辑
显然,在发布Django 1.1后,可以执行以下操作: / p>
Apparently after release of Django 1.1 it would be possible to do the following:
cars = Car.objects.filter(mileage__lt=F('mileage_limit'))
仍然不知道F是否应该像这样与Q一起工作:
Still not sure if F is supposed to work together with Q like this:
cars = Car.objects.filter(Q(mileage__lt=F('mileage_limit')))
推荐答案
如果没有自定义SQL,则无法执行此操作。 django开发人员正在使用一个F()函数来实现:#7210 - F()语法,需要设计反馈。
You can't do this right now without custom SQL. The django devs are working on an F() function that would make it possible: #7210 - F() syntax, design feedback required.
这篇关于Django查询中的列比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!