Как уменьшить запасы при создании экземпляра покупки в 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
. Но я не уверен в связи между инвентаризацией и закупкой. Я предполагаю, что вы сравниваете названия продуктов.
Надеюсь, это поможет вам.