繁体   English   中英

什么是Django中用于SQL联接的等效ORM查询

[英]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=Truenull=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM