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

时间:2013-03-08 01:40:16

标签: mysql django django-models

我有两个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查询:  选择 * 从结果 加入工作 ON job.JID = result.JID

基本上我想连接两个表,然后对该表执行过滤查询。

我是ORM和Django的新手。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

  • 如果表结果作业都有JID,为什么不将它作为外键?我觉得很奇怪。

  • 一个类名以大写开头,类* R * esult,class * J * ob。

答案 2 :(得分: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的更多信息。