热门标签:
Q:

Django:使用Django ORM实现JOIN?

我有一个在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做到这一点? 在这种情况下会有帮助吗?

原网址
A:

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

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

现在每个答案对象都有一个预取的'question'属性,并且 访问它不会再次击中db。

所有回答

共 3 条

author avatar

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

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

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

author avatar
    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()
author avatar

#考虑书籍和出版商之间的外键关系

class Publisher(models.Model):
 name = models.CharField(max_length=100)

eclass Book(models.Model):
 publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

#获取一本书的出版商名称

book = Book.objects.select_related('publisher').get(id=1)
book.publisher.name

#获取有特定出版商的书籍

publisher = Publisher.objects.prefetch_related('book_set').get(id=1)
books = publisher.book_set.all()

了解更多 https://kwikl3arn.com/django/JOINS

相似问题