我试图理解使用prefetch_related和select_related进行优化。我在博客中的某个地方了解到,使用prefetch和select的地方之一是,prefetch_related用于反向关系,select_related用于前向关系。在我的例子中有Resume模型和Education Model。教育模型具有简历的FK和相关的反向关系,而不是在查询时写入附加的_set。我需要用所请求的用户简历列出所请求用户的所有教育。如果没有以下优化技术,我可以做到这一点
education_instance = Resume.objects.get(applicant=request.user).educations.all()
当我尝试使用以下内容时,我收到标题
中所述的错误education_instance = Resume.objects.filter(applicant=request.user).prefetch_related('educations')
这是我的模特
class Resume(models.Model):
applicant = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=100, blank=False, null=False, help_text="Full Name")
class Education(models.Model):
resume = models.ForeignKey(Resume, related_name='educations')
name = models.CharField(max_length=100, blank=False, null=False, help_text="Name of an institution")
任何人都可以通过简单的外行术语让我明确select_related和prefetch_related吗?我无法理解我得到的问题
答案 0 :(得分:2)
根据您提供的例外情况,您尝试在对象.prefetch_related()
上调用Resume
,而不是Resume
s QuerySet
。
所以,确保你运行
Resume.objects.filter(applicant=request.user).prefetch_related('educations')
不是
Resume.objects.get(applicant=request.user).prefetch_related('educations')
答案 1 :(得分:1)
实际上你应该在这种情况下使用select_related。 据我所知,prefetch_related用于多对多关系,它使两个查询检索对象,而select_related用于普通fk或一对一关系,并使用连接获取一个查询中的所有对象。
答案 2 :(得分:0)
What's the difference between select_related and prefetch_related in Django ORM?检查帖子以了解选择相关和预取相关的内容。
答案 3 :(得分:0)
首先要查看[prefetch_related] [1]
的文档[1]:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#prefetch-related然后你会发现你不能像这样使用它
你必须申请教育模式
education_instance = Education.objects.filter(resume__applicant == request.user).prefetch_related('resume')
希望这会对你有所帮助。