Django查询中的列比较

ndh0cuux  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(162)

我有一个如下模型:

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')))
b1uwtaje

b1uwtaje1#

如果没有自定义的SQL,你现在无法做到这一点。django开发人员正在开发一个F()函数,它将使这成为可能:#7210 - F()语法,需要设计反馈。

q3qa4bjr

q3qa4bjr2#

由于我必须根据已接受的答案来查找这个表达式,因此我想快速说明一下,F()表达式确实已经发布,并且可以在查询中使用。
这是F()上的Django文档中的描述:
F()对象表示模型字段的值、模型字段的转换值或带注解的列,它使得引用模型字段值并使用它们执行数据库操作成为可能,而实际上不必将它们从数据库中提取到Python内存中。
相反,Django使用F()对象生成一个SQL表达式来描述数据库级的操作。
使用F()进行查询的参考也提供了有用的示例。

相关问题