Не могу исключить дублирование запросов к базе данных в инлайн модели!

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 = 'Заказанные товары'
Вернуться на верх