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 result JOIN job ON job.JID = result.JID

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

我是 ORM 和 Django 的新手。

4

3 回答 3

3
jobs = job.objects.filter(jid__in=result.objects.values('jid').distinct()
   ).select_related()
于 2013-03-08T01:51:10.050 回答
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 查询来获取它(它可能是另一个查询),但从代码的角度来看效果是一样的(除了性能考虑)。

models.ForeignKey您可以在Django 文档中找到更多信息。

于 2013-03-08T03:15:13.573 回答
0

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

  • 任何 ORM 都可以让 99% 的查询超级容易编写(无需任何 SQL)。对于剩下的 1%,您有 2 个选择:了解 ORM 的核心并添加自定义代码或简单地编写纯 SQL。我建议您为此编写 SQL 查询。

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

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

于 2013-03-08T01:48:55.587 回答