使用Django ORM比较对象字段

1 投票
1 回答
1778 浏览
提问于 2025-04-16 16:57

在Django的ORM中,能否使用小于或大于的运算符来比较不同表中的列呢?

举个例子,我想在Django查询中比较两个对象的字段,这在SQL中相当于:

SELECT a.id
FROM mytable a
LEFT OUTER JOIN myothertable b ON b.id = a.other_id AND a.val < b.someval

显然,我不能使用普通的filter()写法,因为右边的部分假设值是一个具体的数字,而不是一个对象或属性的名字。例如:

MyTable.objects.filter(val__lt=other__someval)

1 个回答

4

S.Lott的回答是个好主意。下面是一个使用F的例子:

class ModelA(models.Model):
    val = IntegerField()
    model_b = ForeignKey('ModelB')

class ModelB(models.Model):
    val = IntegerField()


>>> from django.db.models import F
>>> ModelA.objects.filter(val__lt=F('model_b__val'))
>>> print qs.query
SELECT `test_modela`.`id`, `test_modela`.`val`, `test_modela`.`model_b_id` FROM `test_modela` INNER JOIN `test_modelb` ON (`test_modela`.`model_b_id` = `test_modelb`.`id`) WHERE `test_modela`.`val` <  `test_modelb`.`val`
>>> 

撰写回答