AttributeError:'Resume'对象没有属性'prefetch_related'

时间:2017-09-29 05:20:47

标签: python django python-3.x django-models django-orm

我试图理解使用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吗?我无法理解我得到的问题

4 个答案:

答案 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')

希望这会对你有所帮助。