将对象字段与Django的ORM进行比较 [英] Comparing Object Fields with Django's ORM

查看:113
本文介绍了将对象字段与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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆