无法弄清楚在 Django 中使用 prefetch_related
Could not figure out the use of prefetch_related in django
有一个场景,我想显示用户的总购买量。我确实在用户配置文件模型中使用了@属性。幸运的是,它按我的预期工作。但我想使用 prefetch_related 来优化 django 查询,因为用户的总购买量是根据 order_history 计算的,它与 OrderMenu 有多对多关系。
我表现如何?
class UserProfile(models.Model):
user = models.OneToOneField(User)
slug = models.SlugField(unique=True,blank=True,null=True)
restaurant = models.ManyToManyField(Restaurant, blank=True)
order_history = models.ManyToManyField(OrderMenu, blank=True)
# favorites = models.ManyToManyField(Restaurant)
is_owner = models.BooleanField(default=False)
@property
def total_purchase(self):
total_purchase = 0
# user_order = UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
userprofile = UserProfile.objects.get(slug=self.slug)
user_order = userprofile.order_history.all()
for usr in user_order:
total_purchase += usr.get_cost()
return total_purchase
In this solution, isn't
userprofile = UserProfile.objects.get(slug=self.slug) user_order =
userprofile.order_history.all()
is equivalent to
user_order=UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
我对 prefetch_related 很困惑。谁能用简单的语言启发我?对不起,我的母语不是英语。
两者的区别是
如果
userprofile = UserProfile.objects.get(slug=self.slug)
#hits 数据库
此查询根据条件从数据库中获取用户配置文件的对象
user_order = userprofile.order_history.all()
#再次访问数据库
此查询使用用户配置文件对象再次访问数据库获取 user_order 查询集。
即用户配置文件命中数据库以及 user_order
然而在这种情况下
user_order=UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
user_order 查询集集 returns 不仅是用户配置文件对象,而且 'order_history' 与数据库中的 UserProfile 对象相关的查询集。现在,当您使用 user_order 对象访问 'order_history' 查询集时,它不会访问数据库,而是从 'user_order' 的预取查询集缓存中获取 'order_history' 的查询集。更多信息 here.
有一个场景,我想显示用户的总购买量。我确实在用户配置文件模型中使用了@属性。幸运的是,它按我的预期工作。但我想使用 prefetch_related 来优化 django 查询,因为用户的总购买量是根据 order_history 计算的,它与 OrderMenu 有多对多关系。
我表现如何?
class UserProfile(models.Model):
user = models.OneToOneField(User)
slug = models.SlugField(unique=True,blank=True,null=True)
restaurant = models.ManyToManyField(Restaurant, blank=True)
order_history = models.ManyToManyField(OrderMenu, blank=True)
# favorites = models.ManyToManyField(Restaurant)
is_owner = models.BooleanField(default=False)
@property
def total_purchase(self):
total_purchase = 0
# user_order = UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
userprofile = UserProfile.objects.get(slug=self.slug)
user_order = userprofile.order_history.all()
for usr in user_order:
total_purchase += usr.get_cost()
return total_purchase
In this solution, isn't
userprofile = UserProfile.objects.get(slug=self.slug) user_order = userprofile.order_history.all()
is equivalent to
user_order=UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
我对 prefetch_related 很困惑。谁能用简单的语言启发我?对不起,我的母语不是英语。
两者的区别是
如果
userprofile = UserProfile.objects.get(slug=self.slug)
#hits 数据库
此查询根据条件从数据库中获取用户配置文件的对象
user_order = userprofile.order_history.all()
#再次访问数据库
此查询使用用户配置文件对象再次访问数据库获取 user_order 查询集。
即用户配置文件命中数据库以及 user_order
然而在这种情况下
user_order=UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
user_order 查询集集 returns 不仅是用户配置文件对象,而且 'order_history' 与数据库中的 UserProfile 对象相关的查询集。现在,当您使用 user_order 对象访问 'order_history' 查询集时,它不会访问数据库,而是从 'user_order' 的预取查询集缓存中获取 'order_history' 的查询集。更多信息 here.