首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:“Resume”对象没有属性“”prefetch_related“”

AttributeError:“Resume”对象没有属性“”prefetch_related“”
EN

Stack Overflow用户
提问于 2017-09-29 13:20:47
回答 4查看 2.4K关注 0票数 1

我正在尝试理解prefetch_related和select_related在优化方面的用法。我在博客中了解到,使用预取和选择的位置之一是,prefetch_related用于反向关系,select_related用于正向关系。在我的例子中,有简历模型和教育模型。教育模型在查询时使用related_name进行反向关系的简历的FK,而不是写额外的_set。我需要列出一个被请求的用户的所有教育与被请求的用户简历。我可以在没有这些优化技术的情况下做到这一点,如下所示

代码语言:javascript
复制
education_instance = Resume.objects.get(applicant=request.user).educations.all()

当我尝试使用下面的代码时,我得到了标题中所述的错误

代码语言:javascript
复制
education_instance = Resume.objects.filter(applicant=request.user).prefetch_related('educations')

这是我的模型

代码语言:javascript
复制
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?我不能理解我得到的问题。

EN

回答 4

Stack Overflow用户

发布于 2017-09-29 13:50:26

从您提供的异常中,您尝试在object Resume上调用.prefetch_related(),而不是在ResumeQuerySet上调用。

所以,一定要运行

代码语言:javascript
复制
Resume.objects.filter(applicant=request.user).prefetch_related('educations')

代码语言:javascript
复制
Resume.objects.get(applicant=request.user).prefetch_related('educations')
票数 3
EN

Stack Overflow用户

发布于 2017-09-30 17:13:57

实际上,在这种情况下您应该使用select_related。据我所知,prefetch_related用于多对多关系,它进行两次查询来检索对象,而select_related用于普通的fk或一对一关系,它使用joins在一次查询中获取所有对象。

票数 1
EN

Stack Overflow用户

发布于 2017-09-29 14:12:42

What's the difference between select_related and prefetch_related in Django ORM?查看帖子以了解select相关和预取相关内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46482252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档