【发布时间】:2022-01-07 08:37:43
【问题描述】:
我正在处理一个电子商务项目,其中 django 在使用 django ORM 从数据库中获取产品时会进行大量重复查询。
请找到以下代码供您参考帮助解决。
提前致谢。
产品型号
class Product(models.Model):
variations = (
('None', 'None'),
('Size', 'Size'),
)
name = models.CharField(max_length=200, unique=True)
store = models.ManyToManyField(Store)
slug = models.SlugField(null=True, blank=True, unique=True, max_length=500)
sku = models.CharField(max_length=30, null=True)
tax = models.IntegerField(null=True, blank=True)
stock = models.CharField(max_length=10, null=True)
variations = models.CharField(choices=variations, max_length=20)
short_description = models.CharField(max_length=500, null=True)
details = RichTextUploadingField(null=True, blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
discounted_price = models.DecimalField(max_digits=10, decimal_places=2, null=True,
blank=True)
delivery_time = models.CharField(max_length=5, null=True, blank=True,
verbose_name="Delivery Time")
returnable = models.BooleanField(max_length=5, null=True, blank=True,
verbose_name="Returnable")
emi = models.BooleanField(max_length=5, null=True, blank=True, verbose_name="EMI
available")
image = models.ImageField(upload_to='product/images', default='product.png',
null=True, blank=True)
image_one = models.ImageField(upload_to='product/images', null=True, blank=True)
image_two = models.ImageField(upload_to='product/images', null=True, blank=True)
image_three = models.ImageField(upload_to='product/images', null=True, blank=True)
image_four = models.ImageField(upload_to='product/images', null=True, blank=True)
image_five = models.ImageField(upload_to='product/images', null=True, blank=True)
tags = models.ManyToManyField(Tags)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True,
blank=True,
related_name='products')
status = models.CharField(max_length=20, choices=(('Active', 'Active'), ('Inactive',
'Inactive')))
brand = models.ForeignKey(Brand, on_delete=models.PROTECT, blank=True, null=True)
offer = models.ForeignKey(Offer, on_delete=models.CASCADE, null=True,
blank=True) # This is used only for filtration
color = models.ManyToManyField(Colors)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super(Product, self).save(*args, **kwargs)
def __str__(self):
return str(self.pk) + ":" + self.name + ":"
@property
def get_rating(self):
total = sum(int(review['stars']) for review in
self.reviews.select_related('r_product').values())
return total
产品评论课
class ProductReview(models.Model):
r_product = models.ForeignKey(Product, on_delete=models.CASCADE,
related_name='reviews')
review_by = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True,
related_name='reviews')
stars = models.IntegerField(default=0,
validators=[MaxValueValidator(5), MinValueValidator(0)]
)
notes = models.CharField(max_length=500, null=True, blank=True)
date = models.DateField(auto_now_add=True)
这是 django 调试工具栏结果
SELECT "backend_productreview"."id",
"backend_productreview"."r_product_id",
"backend_productreview"."review_by_id",
"backend_productreview"."stars",
"backend_productreview"."notes",
"backend_productreview"."date"
FROM "backend_productreview"
WHERE "backend_productreview"."r_product_id" = '102'
114 个类似的查询。复制了 2 次。
这是 django 调试工具栏突出显示的查询
total = sum(int(review['stars']) for review in
self.reviews.select_related('r_product').values())
【问题讨论】:
-
你可能想使用 django 的
aggregate到Sum的评论。 h看看aggregation
标签: python-3.x django django-models django-views