【发布时间】:2023-04-03 08:49:01
【问题描述】:
有一种情况,我想显示用户的总购买量。我确实在用户配置文件模型中使用了@property。幸运的是,它按我的预期工作。但我想使用 prefetch_related 来优化 django 查询,因为用户的总购买量是从 order_history 计算出来的,它与 OrderMenu 有 ManyToMany 关系。
我做得怎么样?
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
在这个解决方案中,不是
userprofile = UserProfile.objects.get(slug=self.slug) user_order = userprofile.order_history.all()
等价于
user_order=UserProfile.objects.prefetch_related('order_history').get(slug=self.slug)
我对 prefetch_related 感到非常困惑。谁能用简单的语言启发我?对不起,我不是以英语为母语的人。
【问题讨论】:
标签: python django django-models query-optimization django-orm