Django делает тонны дублирующихся запросов

Я работаю над проектом электронной коммерции, где 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())

Вы можете попробовать это, надеюсь, это сработает

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

Вернуться на верх