我有两个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的新手。
答案 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=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 documentation中找到有关models.ForeignKey
的更多信息。