【问题标题】:Django making tons of duplicate queriesDjango 进行大量重复查询
【发布时间】: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 的 aggregateSum 的评论。 h看看aggregation

标签: python-3.x django django-models django-views


【解决方案1】:

你可以试试这个,希望能成功

from django.db.models import Sum
self.reviews.aggregate(Sum('stars'))
# returns {'starts__sum': 1000} for example

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 2016-10-12
    • 2013-07-04
    • 2017-06-13
    • 2019-04-17
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多