Шалом, уважаемые.
Начал я как-то углублённо Джангу изучать (о чём сейчас искренне сожалею) и в одном из учебных заданий вылезла бяка: есть следующие модели:
class Pizza(models.Model):
name = models.CharField(null=False, max_length=200)
dough = models.ForeignKey(Dough, on_delete=models.CASCADE, default=0)
topping = models.ForeignKey(Topping, on_delete=models.CASCADE, default=0)
price = models.DecimalField(max_digits=5, decimal_places=2, default=0)
def __str__(self):
return self.name
def make_order(self, count):
return InstancePizza.objects.create(name=self.name, price=self.price, pizza_template=self, count=count)
class InstancePizza(models.Model):
pizza_template = models.ForeignKey(Pizza, related_name='pizza_template', on_delete=models.SET_NULL, null=True, blank=True)
count = models.PositiveIntegerField(default=1)
name = models.CharField(null=True, blank=True, max_length=200)
price = models.DecimalField(max_digits=5, decimal_places=2, default=0, null=True, blank=True)
def __str__(self):
return 'name: {}, price: {}, full price: {}'.format(self.name, str(self.price), str(self.price * self.count))
class Order(models.Model):
pizzas = models.ManyToManyField(InstancePizza, related_name='order_template')
date = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
price = models.DecimalField(default=0, max_digits=7, decimal_places=2, null=True, blank=True)
def __str__(self):
return 'OrderID: {}, price: {}'.format(str(self.id), str(self.price))
def get_price(self):
pizzas = self.pizzas.all()
price = 0
for pizza in pizzas:
price += pizza.price * pizza.count
return price
def change_order_price(self):
user = self.user
self.refresh_from_db()
price = 0
for instance_pizza in InstancePizza.objects.all().filter(order_template__user=user):
price += instance_pizza.price * instance_pizza.count
print('Print_____ ', price)
self.price = price
self.save()
суть проблемы в следующем: для обновления Order-а я использую вьюшку (на принты и прочий шлак прошу не обращать внимание :)):
class UpdateOrder(UpdateView):
model = Order
form_class = UpdateOrderForm
template_name = 'update_order.html'
success_url = '/basket/'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
curent_order = Order.objects.filter(user=self.request.user)
user = 0
context['instances_pizzas'] = InstancePizza.objects.all().filter(order_template__user=self.request.user)
return context
def form_valid(self, form):
curent_order = Order.objects.get(user=self.request.user)
print('PRICE1', curent_order.price, curent_order.id)
curent_order.change_order_price()
Order.objects.filter(user=self.request.user).update(price=Order.objects.get(user=self.request.user).get_price())
curent_order.change_order_price()
print('PRICE3', curent_order.price, curent_order.pizzas, curent_order.id)
order = Order.objects.get(id=1)
order.price = 200
order.save()
print('EXAMPLE: ', order.order_template.all())
print('PRICE 4', curent_order.price, curent_order.pizzas, curent_order.id)
return super().form_valid(form)
которая НЕ ОБНОВЛЯЕТ ордер((
Из найдёного в гугле есть подозрение на m2m, который работает несколько странно в джанге. Но как это разрулить - хз ((
У кого нибудь есть предположения? Буду рад любым, т.к. сам я иссяк ((