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(),而不是 Resumes 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”属性的主要内容,如果未能解决你的问题,请参考以下文章

1.8.2suspend与resume方法的缺点-独占

AttributeError: 'RDD' 对象没有属性 'show'

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:“模块”对象没有属性“WebSocketApp”

AttributeError:“模块”对象没有属性“作者”

初学者 Python:AttributeError:'list' 对象没有属性