Python 从Django中的两个不同类模型中减去两个量值

Python 从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

我想在完成付款后做一个减法。我有两种型号,产品和订单有两种不同的数量。我尝试了下面的函数来处理它,但它的数量保持不变。该函数工作正常,但唯一的问题是数量

对于上述问题,我尝试了两种方法,但都不起作用

视图1.py 1

@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)

更多信息可在和查询文档中找到。

谢谢!现在可以了。