Проверка свойств объекта на основе сепаратного представления (Django|Django-Rest-Framework)

Я использую django-rest-framework и React.js. Мне нужна отдельная функция в бэкенде для проверки, если CartItem.amount ниже, чем ProductStock.quantity, если CartItem.product равно ProductStock.id, конечно (эта часть не работает). Для той же функции мне нужно проверить, является ли ценообразование таким же, как в модели Product, но удивительно, что эта часть функции работает. Что я могу сделать, чтобы убедиться, что CartItem.amount будет снижена, если она выше, чем ProductStock.quantity?

Код ниже:

Product является чертежом для остальных моделей.

ProductStock отслеживает количество различных размеров всех товаров.

CartItem - это модель, используемая для отслеживания того, сколько товаров купил пользователь.

models.py

class Product(models.Model):
    name = models.CharField(max_length=150)
    price = models.IntegerField()
    slug = models.SlugField(blank=True, null=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Product, self).save()

class ProductStock(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    size = models.CharField(max_length=6)
    quantity = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.quantity} x {self.product.name}: {self.size}'

class CartItem(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    product = models.ForeignKey(ProductStock, on_delete=models.CASCADE, blank=True, null=True)
    amount = models.IntegerField(default=0, blank=True, null=True)
    size = models.CharField(max_length=10, blank=True, null=True)
    price = models.IntegerField(blank=True, null=True)

    def __str__(self):
        return f'{self.user.email}, {self.product.product.name}, {self.product.size}: {self.amount}'
    
    def save(self, *args, **kwargs):
        if self.amount > self.product.quantity:
            self.amount = self.product.quantity
        self.size = self.product.size
        self.price = self.product.product.price
        super(CartItem, self).save()

views.py

def check_cart_content(request,user_id):
    cart = CartItem.objects.filter(user=user_id)

    for item in cart:
        product_stock = ProductStock.objects.filter(product=item.product.id)
        for stock in product_stock:
            if item.amount > stock.quantity:
                item.amount = stock.quantity

            product = Product.objects.get(id=item.product.id)
            if item.price != product.price:
                item.price = product.price

            item.save()

            return JsonResponse({'success': 'Cart checked'})

Необходимо изменить отступ JsonResponse, потому что он заканчивается после первого stock в product_stock. Также item.save() и больше, вероятно, нуждаются в изменении отступов. Пересмотрите это в чистом Python.

def check_cart_content(request,user_id):
    cart = CartItem.objects.filter(user=user_id)

    for item in cart:
        product_stock = ProductStock.objects.filter(product=item.product.id)
        for stock in product_stock:
            if item.amount > stock.quantity:
                item.amount = stock.quantity

        product = Product.objects.get(id=item.product.id)
        if item.price != product.price:
            item.price = product.price

        item.save()

    return JsonResponse({'success': 'Cart checked'})

Вам следует подумать о перестройке дерева моделей, потому что ProductStock с ForeignKey кажется плохим решением. Было бы лучше считать в функции Product, что-то подобное:

def quantity(self):
    return Product.objects.all().count()

потому что он работает динамически и вам не нужны дополнительные объекты в базе данных.

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