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