将对象字段与Django的ORM进行比较 [英] Comparing Object Fields with Django's ORM
本文介绍了将对象字段与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()符号,因为RHS假定该值是一个文字,而不是一个对象/属性名称。例如
MyTable.objects.filter(val__lt = other__someval)
解决方案
S.Lott的答案是要走的路。以下是使用F的示例:
class ModelA(models.Model):
val = IntegerField()
model_b = ForeignKey('ModelB')
class ModelB(models.Model):
val = IntegerField()
>> ;>从django.db.models导入F
>>> ModelA.objects.filter(val__lt = F('model_b__val'))
>>>打印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`
>>>
Is comparing columns in different tables using less-than/greater-than operators supported in Django's ORM?
For example, I'm trying to compare two object fields in a Django query, which would have the SQL equivalent of:
SELECT a.id
FROM mytable a
LEFT OUTER JOIN myothertable b ON b.id = a.other_id AND a.val < b.someval
Clearly, I can't use the normal filter() notation, since the RHS assumes the value is a literal, not an object/attribute name. e.g.
MyTable.objects.filter(val__lt=other__someval)
解决方案
S.Lott's answer is the way to go. Here's an example of using 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`
>>>
这篇关于将对象字段与Django的ORM进行比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文