【问题标题】:Column comparison in Django queriesDjango 查询中的列比较
【发布时间】:2009-01-11 17:47:51
【问题描述】:

我有以下型号:

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

【问题讨论】:

    标签: python django orm


    【解决方案1】:

    如果没有自定义 SQL,您现在无法执行此操作。 django 开发人员正在开发一个 F() 函数,这将使它成为可能:#7210 - F() syntax, design feedback required.

    【讨论】:

    • 我正在查看ticket 7210 code.djangoproject.com/ticket/7210 类似这个问题的接缝已经解决。有谁知道什么时候发布?它是 1.1 版本的一部分吗?
    • 它应该是 Django 1.1 的一部分,计划在 3 月发布。不过,它可能会很快进入 SVN 主干,因此您可以从那里使用它。
    • 它现在在 Django SVN 主干中,所以如果你想要的话,你可以得到它。
    猜你喜欢
    • 2013-04-10
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多