我有两个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 回答
我不知道如何在Django ORM中这样做,但这是我的2美分:
任何ORM使99%的查询都非常容易编写(没有任何SQL) . 对于剩下的1%,您有两个选择:了解ORM的核心并添加自定义代码或者只需编写纯SQL . 我建议你为它编写SQL查询 .
如果表 result 和 job 都有JID,为什么不将它作为外键?我发现这很奇怪 .
类名以大写开头,类* R * esult,类* J * ob .
您可以通过修改结果类来表示Django模型中的外键:
(我已经读过你需要添加
blank=True
和null=True
以在Django中使外键可选的地方,你可以尝试不同的选项) .现在,您只需编写以下内容即可访问结果的作业:
使用参数
related_name="results"
,Django会自动将新字段添加到类job
中,因此您可以编写:并获得作业
myjob
的结果 .这并不意味着它必须由Django ORM通过JOIN查询获取(它可能是另一个查询),但从代码的角度来看效果是相同的(除了性能考虑因素) .
您可以在Django documentation中找到有关
models.ForeignKey
的更多信息 .