AttributeError:“Resume”对象没有“prefetch_related”属性
Posted
技术标签:
【中文标题】AttributeError:“Resume”对象没有“prefetch_related”属性【英文标题】:AttributeError: 'Resume' object has no attribute 'prefetch_related' 【发布时间】:2018-03-10 23:18:13 【问题描述】:我试图了解 prefetch_related 和 select_related 用于优化的用途。我在博客的某处了解到,使用 prefetch 和 select 的地方之一是 prefetch_related 用于反向关系,而 select_related 用于正向关系。就我而言,有简历模型和教育模型。教育模型具有resume 的FK 和related_name 用于反向关系,而不是在查询时编写额外的_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 吗?我无法理解我遇到的问题
【问题讨论】:
【参考方案1】:实际上,在这种情况下您应该使用 select_related。 据我所知,prefetch_related 用于多对多关系,它进行两个查询来检索对象,而 select_related 用于普通 fk 或一对一关系,它使用连接在一个查询中获取所有对象。
【讨论】:
【参考方案2】:首先通过这个[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')
希望这会对你有所帮助。
【讨论】:
感谢您的解决方案。我一定会查看你们为我推荐的所有链接。在去那个链接之前,我不确定我是否会进入它,所以我想问一下 prefetch_related 里面的简历是什么。是 Education 表中的字段(fk)吗? yes resume in prefetch_related is fk in Education table.【参考方案3】:What's the difference between select_related and prefetch_related in Django ORM?查看该帖子以了解选择相关和预取相关。
【讨论】:
【参考方案4】:根据您提供的异常,您尝试在对象 Resume
上调用 .prefetch_related()
,而不是 Resume
s QuerySet
。
所以,请确保你运行
Resume.objects.filter(applicant=request.user).prefetch_related('educations')
不是
Resume.objects.get(applicant=request.user).prefetch_related('educations')
【讨论】:
这样我只得到一个查询而不是全部 @milan 你说的QuerySet
是什么意思?以上是关于AttributeError:“Resume”对象没有“prefetch_related”属性的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError: 'RDD' 对象没有属性 'show'
AttributeError:“NumpyArrayIterator”对象没有属性“类”