gpt4 book ai didi

python - 无法弄清楚在 django 中使用 prefetch_related

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:20 26 4
gpt4 key购买 nike

有一个场景,我想显示用户的总购买量。我确实在用户配置文件模型中使用了@property。幸运的是,它按我的预期工作。但是我想使用 prefetch_related 来优化 Django 查询,因为用户的总购买量是根据与 OrderMenu 具有多对多关系的 order_history 计算的。

我是怎么做到的?

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 database

该查询根据条件从数据库中获取userprofile对象

user_order = userprofile.order_history.all() #再次访问数据库

此查询使用 userprofile 对象再次访问数据库获取 user_order 查询集。

即userprofile 命中数据库以及 user_order

但是在这种情况下

user_order=UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)

user_order 查询集集不仅返回用户配置文件对象,还返回与 UserProfile 对象相关的“order_history”查询集,一次命中数据库。现在,当您使用 user_order 对象访问“order_history”查询集时,它不会访问数据库,而是从“user_order”的预取查询集缓存中获取“order_history”的查询集。更多信息 here .

关于python - 无法弄清楚在 django 中使用 prefetch_related,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39061107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com