Как уменьшить запасы при создании экземпляра покупки в Django?

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

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

Ниже представлены мои models.py и views.py.

Models.py

class Inventory(models.Model):
    ingredient_name = models.CharField(max_length=30)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    units_avail = models.IntegerField()

    def __str__(self):
        return self.ingredient_name + " avail: " + str(self.units_avail)

    def get_absolute_url(self):
        return "/inventory"

class MenuItem(models.Model):
    menu_item_name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.menu_item_name + " with Price: " + str(self.price)

    def available(self):
        return all(recipe_req.enough() for recipe_req in self.reciperequirement_set.all())

    def get_absolute_url(self):
        return "/menu"
    
    def cost(self):
        item_cost = 0
        for recipe_req in self.reciperequirement_set.all():
            item_cost += recipe_req.ingredient.price
        return item_cost
    
    def profit(self):
        item_cost = self.cost()
        item_profit = self.price - item_cost
        return item_profit

class RecipeRequirement(models.Model):
    ingredient = models.ForeignKey(Inventory, on_delete=models.CASCADE)
    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    quantity = models.IntegerField()

    def __str__(self):
        return self.ingredient.ingredient_name + " in " + self.menu_item.menu_item_name

    def enough(self):
        return self.quantity <= self.ingredient.units_avail

    def get_absolute_url(self):
        return "/recipe"

class Purchase(models.Model):
    menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.menu_item.menu_item_name + " at " + self.timestamp
    
    def get_absolute_url(self):
        return "/purchase"

Views.py

def index(request):
    return render(request, "index.html")

class InventoryListView(ListView):
    template_name = "inventory.html"
    model = Inventory
    context_object_name = "inventory_list"

class MenuListView(ListView):
    template_name = "menu.html"
    model = MenuItem
    context_object_name = "menu_list"

class InventoryUpdateView(UpdateView):
    model = Inventory
    template_name = "inventory_update.html"
    form_class = InventoryUpdateForm
    context_object_name = "inventory_update"

class InventoryCreateView(CreateView):
    model = Inventory
    template_name = "inventory_create.html"
    form_class = InventoryCreateForm
    context_object_name = "inventory_create"

class MenuItemCreateView(CreateView):
    model = MenuItem
    template_name = "menu_create.html"
    form_class = MenuItemCreateForm
    context_object_name = "menu_create"

class RecipeRequirementListView(ListView):
    template_name = "recipe.html"
    model = RecipeRequirement
    context_object_name = "recipe_list"

class RecipeRequirementCreateView(CreateView):
    model = RecipeRequirement
    template_name = "recipe_create.html"
    form_class = RecipeCreateForm
    context_object_name = "recipe_create"

class PurchaseListView(ListView):
    template_name = "purchase.html"
    model = Purchase
    context_object_name = "purchase_list"

class PurchaseCreateView(CreateView):
    model = Purchase
    template_name = "purchase_create.html"
    form_class = PurchaseCreateForm
    context_object_name = "purchase_create"

Каждый раз, когда вы совершаете покупку, вы должны приобрести количество, верно? Поместите этот запрос после создания объекта Purchase и сохраните purchase_qty в переменной.

purchased_qty = 10
Inventory.objects.filter(ingredient_name='xyz').update(units_avail=F("units_avail") - int(purchased_qty ))

Это сделает минус купленное количество из вашего Available qty из Inventory. Но я не уверен в связи между инвентаризацией и закупкой. Я предполагаю, что вы сравниваете названия продуктов. Надеюсь, это поможет вам.

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