Как создать вычитание в инвентаре при оформлении заказа? [Django] [Python] [Сайт электронной коммерции]

Я новичок в python/django. Я решил создать сайт электронной коммерции с использованием django для академического проекта. Я смог достаточно развить проект и достичь понимания предмета, но сейчас у меня проблемы с поиском способа вычитать количество товаров, перечисленных в инвентаре, всякий раз, когда делается заказ.

Это код для моделей, каждый продукт имеет свое собственное количество на складе, называемое инвентаризацией:

class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    price = models.FloatField()
    description = models.TextField(default='', null=True, blank=True)
    digital = models.BooleanField(default=False,null=True, blank=True)
    image = models.ImageField(null=True, blank=True)
    inventory = models.IntegerField(default=0)

    def __str__(self):
        return self.name

    def has_inventory(self):
        return self.inventory > 0

Этот код я сделал для вычитания на основе количества заказанного товара, но я не могу заставить его работать, он не вычитает количество товаров из инвентаря на складе товара.

class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.product) + " x " + str(self.quantity)

    def inventory(self):
        product.inventory = self.inventory
        product.inventory -= int(self.quantity)
        return inventory

Что я могу сделать, чтобы это сработало?

Вся логика/действие должны быть написаны в файле views.py. Вы можете создать функцию, которая принимает запрос, и когда она его принимает, она принимает все значения, введенные через форму, и вы можете использовать filter для фильтрации продуктов, которые вы хотите вычесть из инвентаря, и update запрос Django для обновления инвентаря.

Внутри вашей функции views это должно выглядеть примерно так:

Product.objects.filter(name = name, description = description, digital = digital).update(Inventory = F('Inventory')-inventory)

Вот документация Django по запросам: Django's Making Queries

Мне кажется, что в приведенном выше фрагменте есть несколько проблем.

Во-первых, OrderItem.inventory не ссылается на правильное значение, оно должно быть таким, как в приведенном ниже фрагменте.

    def inventory(self):
        // remember the current stock is stored on Product.inventory
        return self.product.inventory - self.quantity

Во-вторых, имя метода должно быть remaining_stock, а не inventory, чтобы избежать недопонимания.

    def remaining_stock(self):
        return self.product.inventory - self.quantity

Кроме того, не забудьте, если вы хотите сохранить inventory продукта, вызовите метод save после успешной вставки OrderItem.

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