一尘不染

Django:使用Django ORM实现JOIN?

django

我在Django中使用以下模型构建了一个问答类型的网站:

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

class Answer(models.Model):
    question_id = IntegerField()
    details = models.TextField()

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

Question.objects.get(id=1)
Answer.objects.get(question_id=1)[:10]

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

SELECT *
FROM Question JOIN Answer ON Question.id=Answer.question_id
WHERE Question.id=1
LIMIT 10

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


阅读 2178

收藏
2020-03-31

共2个答案

一尘不染

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

answers = Answer.objects.filter(question_id=1).select_related() 

现在,每个答案对象都有一个预取的“问题”属性,对其进行访问不会再影响数据库。

2020-03-31
一尘不染

考虑使用models.ForeignKey(Question)代替question_id = IntegerField()

这是表达你要描述的问题和答案之间关系的最佳(更具关系性)方法。

这样,你可以简单地致电Answers.objects.filter(question_id=<id>)并获得所需的确切信息。

2020-03-31