我正在尝试理解prefetch_related和select_related在优化方面的用法。我在博客中了解到,使用预取和选择的位置之一是,prefetch_related用于反向关系,select_related用于正向关系。在我的例子中,有简历模型和教育模型。教育模型在查询时使用related_name进行反向关系的简历的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?我不能理解我得到的问题。
发布于 2017-09-29 13:50:26
从您提供的异常中,您尝试在object Resume上调用.prefetch_related(),而不是在Resume的QuerySet上调用。
所以,一定要运行
Resume.objects.filter(applicant=request.user).prefetch_related('educations')不
Resume.objects.get(applicant=request.user).prefetch_related('educations')发布于 2017-09-30 17:13:57
实际上,在这种情况下您应该使用select_related。据我所知,prefetch_related用于多对多关系,它进行两次查询来检索对象,而select_related用于普通的fk或一对一关系,它使用joins在一次查询中获取所有对象。
发布于 2017-09-29 14:12:42
What's the difference between select_related and prefetch_related in Django ORM?查看帖子以了解select相关和预取相关内容。
https://stackoverflow.com/questions/46482252
复制相似问题