Python 从Django中的两个不同类模型中减去两个量值
我想在完成付款后做一个减法。我有两种型号,产品和订单有两种不同的数量。我尝试了下面的函数来处理它,但它的数量保持不变。该函数工作正常,但唯一的问题是数量 对于上述问题,我尝试了两种方法,但都不起作用 视图1.py 1Python 从Django中的两个不同类模型中减去两个量值,python,django,Python,Django,我想在完成付款后做一个减法。我有两种型号,产品和订单有两种不同的数量。我尝试了下面的函数来处理它,但它的数量保持不变。该函数工作正常,但唯一的问题是数量 对于上述问题,我尝试了两种方法,但都不起作用 视图1.py 1 @login_required def paymentComplete(request): try: body = json.loads(request.body) order = Order.objects.get(id=body['ord
@login_required
def paymentComplete(request):
try:
body = json.loads(request.body)
order = Order.objects.get(id=body['orderID'])
for order_item in order.items.all():
orderitem = order_item.item.item_quantity
item = order_item.quantity
order_item.item.item_quantity = int(orderitem) - int(item)
order_item.ordered = True
order_item.save()
order.ordered = True
order.total_price = body['total']
order.save()
messages.success(request, "Order has been processed!")
return JsonResponse('Payment Complete', safe=False)
except:
messages.warning(request, "Payment did not go throuh")
return redirect('order-summary')
Views.py第二
@login_required
def paymentComplete(request):
try:
body = json.loads(request.body)
order = Order.objects.get(id=body['orderID'])
for order_item in order.items.all():
order_item.item.item_quantity -= order_item.quantity
order_item.ordered = True
order_item.save()
order.ordered = True
order.total_price = body['total']
order.save()
messages.success(request, "Order has been processed!")
return JsonResponse('Payment Complete', safe=False)
except:
messages.warning(request, "Payment did not go throuh")
return redirect('order-summary')
Models.py
class Item(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
price = models.FloatField()
stored = models.DateTimeField(auto_now_add=True)
item_quantity = models.IntegerField(default=1)
img = models.ImageField(upload_to=get_upload_path)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=15)
slug = models.SlugField()
class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
item = models.ForeignKey(Item, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
ordered = models.BooleanField(default=False)
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
items = models.ManyToManyField(OrderItem)
ordered_date = models.DateTimeField(auto_now_add=True)
ordered = models.BooleanField(default=False)
total_price = models.FloatField(null=True, blank=True)
shipping_address = models.CharField(max_length=250)
reference_number = models.CharField(max_length=10, null=True, blank=True,
default=create_new_ref_number())
您需要保存
订单\项目。项目以及更改项目数量:
order_item.item.item_quantity -= order_item.quantity
order_item.item.save()
但更优化的方法可以减少DB点击:
# update item quantity
from django.db.models import F, Sum, ExpressionWrapper, IntegerField
Item.objects.filter(orderitem__order=order).annotate(
quantity=Sum("orderitem__quantity")
).update(
item_quantity=ExpressionWrapper(
F("item_quantity") - F("quantity"), output_field=IntegerField()
)
)
# update order item status
order.items.update(ordered=True)
更多信息可在和查询文档中找到。谢谢!现在可以了。