Django:使用Django ORM实现JOIN?

Con*_*ion 18 django join django-models django-orm django-queryset

我有一个用Django构建的Q&A类型的网站,其中包含以下模型:

class Question(models.Model):
    title = models.CharField(max_length=70)
    details = models.TextField()

class Answer(models.Model):
    question_id = IntegerField()
    details = models.TextField()
Run Code Online (Sandbox Code Playgroud)

我需要显示一个特定的问题及其答案.通常我需要2个查询来做到这一点:

Question.objects.get(id=1)
Answer.objects.get(question_id=1)[:10]
Run Code Online (Sandbox Code Playgroud)

我希望使用一个查询检索所有内容.在MySQL中,它将是:

SELECT *
FROM Question JOIN Answer ON Question.id=Answer.question_id
WHERE Question.id=1
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

无论如何我可以通过Django的ORM来做到这一点吗?请问extra()在这种情况下帮助吗?

bak*_*048 38

考虑使用models.ForeignKey(Question)而不是question_id = IntegerField().

这是表达您试图描绘的问题和答案之间关系的最佳(更多关系)方式.

通过这种方式,您可以简单地调用Answers.objects.filter(question_id=<id>)并获得您正在寻找的内容.


Dan*_*man 36

这正是select_related()所做的.唯一的问题是你必须从Answer模型开始,而不是问题,但结果是一样的:

answers = Answer.objects.filter(question_id=1).select_related() 
Run Code Online (Sandbox Code Playgroud)

现在每个答案对象都有一个预取的"问题"属性,访问它不会再次命中数据库.

  • 如果question_id只是一个整数,而Answer没有为Question提供一个models.ForeignKey字段,这怎么办? (5认同)
  • 谢谢,如果我们需要相关表上的外键名称,假设表 A 与 B 相关,B 与 C 相关。(所有表只有“名称”和“ID”)。我们希望通过相关的 C 表对象连接 A 的每个条目。 (2认同)

小智 6

    class Question(models.Model):
      title = models.CharField(max_length=70)
      details = models.TextField()

    class Answer(models.Model):
      question = models.ForeignKey('Question')
      details = models.TextField()

    id = <whatever_id>    
    answers = Question.objects.get(id=id).answer_set.all()
Run Code Online (Sandbox Code Playgroud)