[英]what is the equivalent ORM query in Django for sql join
我有两个django模型,它们彼此之间没有关系,但是有一个共同的JID(我没有把它做成外键):
class result(models.Model):
rid = models.IntegerField(primary_key=True, db_column='RID')
jid = models.IntegerField(null=True, db_column='JID', blank=True)
test_case = models.CharField(max_length=135, blank=True)
class job(models.Model):
jid = models.IntegerField(primary_key = True, db_column='JID')
client_build = models.IntegerField(max_length=135,null=True, blank=True)
我想在ORM中实现此sql查询:SELECT * FROM result JOIN job ON job.JID = result.JID
基本上,我想联接两个表,然后对该表执行过滤器查询。
我是ORM和Django的新手。
jobs = job.objects.filter(jid__in=result.objects.values('jid').distinct()
).select_related()
我不知道如何在Django ORM中执行此操作,但这是我的2美分:
任何ORM都使99%的查询超级容易编写(无需任何SQL)。 对于剩下的1%,您有2个选择:了解ORM的核心并添加自定义代码,或者仅编写纯SQL。 我建议您为此编写SQL查询。
如果表结果和作业都具有JID,为什么不将其设为外键? 我觉得很奇怪。
类名以大写字母开头,即class * R *结果,class * J * ob。
您可以通过修改结果类来在Django模型中表示外键:
class result(models.Model):
rid = models.IntegerField(primary_key=True, db_column='RID')
# jid = models.IntegerField(null=True, db_column='JID', blank=True)
job = models.ForeignKey(job, db_column='JID', blank=True, null=True, related_name="results")
test_case = models.CharField(max_length=135, blank=True)
(我读过某个地方,您需要同时添加blank=True
和null=True
来使外键在Django中成为可选选项,您可以尝试其他选项)。
现在,您只需编写以下内容即可访问结果作业:
myresult.job # assuming myresult is an instance of class result
使用参数related_name="results"
,Django将自动将一个新字段添加到类job
,因此您可以编写:
myjob.results
并获得作业myjob
的结果。
这并不意味着它将由Django ORM使用JOIN查询(它可能是另一个查询)来获取,但是从代码的角度来看,其效果是相同的(除了性能方面的考虑)。
您可以在Django文档中找到有关models.ForeignKey
更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.