Не могу исключить дублирование запросов к базе данных в инлайн модели!
admin.py
class OrderItemInline(admin.TabularInline):
model = OrderItem
raw_id_fields = ['product']
autocomplete_fields = ['size']
extra = 1 # Количество пустых форм для добавления новых элементов
fields = ['product_image','product','product_article_number','product_mesto','size','product_zacup_price','quantity', 'price','get_cost']
readonly_fields = ['product_image','product_article_number','product_mesto','product_zacup_price','get_cost']
def get_queryset(self, request):
# Загружаем связанные модели для оптимизации запросов
queryset = super().get_queryset(request)
return queryset.select_related('size','product').prefetch_related(
'product__images',
'product__product_prices', # Предварительная загрузка цен для продукта
)
def product_article_number(self, obj):
return obj.product.article_number
product_article_number.short_description = 'Артикул'
def product_mesto(self, obj):
return obj.product.mesto
product_mesto.short_description = 'Место'
# def product_zacup_price(self, obj):
# product_prices = obj.product.product_prices.get(size=obj.size)
# print(product_prices.zacup_price)
# return product_prices.zacup_price
# product_zacup_price.short_description = 'Закупочная цена'
# def product_zacup_price(self, obj):
# return obj.product.product_prices.get(size=obj.size).zacup_price
# product_zacup_price.short_description = 'Закупочная цена'
def product_zacup_price(self, obj):
# Получаем все цены для продукта заранее
prices = {price.size_id: price.zacup_price for price in obj.product.product_prices.all()}
return prices.get(obj.size.id, 'Нет цены') # Возвращаем цену для текущего размера или 'Нет цены'
product_zacup_price.short_description = 'Закупочная цена'
def product_image(self, obj):
# Получаем все изображения заранее
images = obj.product.images.all() # Используем предзагруженные изображения
if images:
first_image = images[0]
return mark_safe(f"<img src='{first_image.image.url}' width='50'>")
else:
return 'Нет фото'
product_image.short_description = 'Фото товара'
models.py
class OrderItem(models.Model):
order = models.ForeignKey(Order,related_name='items',on_delete=models.CASCADE, db_index=True)
product = models.ForeignKey(Product,related_name='order_items', on_delete=models.CASCADE,verbose_name="Название товара", db_index=True)
price = models.DecimalField(max_digits=10,decimal_places=0, verbose_name="Цена", db_index=True)
quantity = models.PositiveIntegerField(default=1,verbose_name="Количество", db_index=True)
size = models.ForeignKey(Size, on_delete=models.SET_NULL, null=True, verbose_name="Размер", db_index=True) # Изменено на ForeignKey
def __str__(self):
return str(self.product.title)
def get_cost(self):
if self.price is not None and self.quantity is not None:
return self.price * self.quantity
return 0 # Возвращаем 0, если одно из значений отсутствует
get_cost.short_description = 'Общая стоимость' # Заголовок столбца
class Meta:
verbose_name = 'Заказанный товар'
verbose_name_plural = 'Заказанные товары'
Вернуться на верх