首页 文章

什么是Django中sql join的等效ORM查询

提问于
浏览
0

我有两个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结果JOIN job ON job.JID = result.JID

基本上我想加入两个表,然后对该表执行过滤查询 .

我是ORM和Django的新手 .

3 回答

  • 0
    jobs = job.objects.filter(jid__in=result.objects.values('jid').distinct()
       ).select_related()
    
  • 3

    我不知道如何在Django ORM中这样做,但这是我的2美分:

    • 任何ORM使99%的查询都非常容易编写(没有任何SQL) . 对于剩下的1%,您有两个选择:了解ORM的核心并添加自定义代码或者只需编写纯SQL . 我建议你为它编写SQL查询 .

    • 如果表 resultjob 都有JID,为什么不将它作为外键?我发现这很奇怪 .

    • 类名以大写开头,类* R * esult,类* J * ob .

  • 0

    您可以通过修改结果类来表示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 documentation中找到有关 models.ForeignKey 的更多信息 .

相关问题