首页 > 解决方案 > 从 Django 中的两个不同的类模型中减去两个数量值

问题描述

完成付款后,我正在尝试做减法。我有 2 个模型,项目和订单有 2 个不同的数量。我尝试了下面的函数来处理它,但它仍然是相同的数量。该功能工作正常,但唯一的问题是数量。

我已经为上述问题尝试了两种方法,但都不起作用。

Views.py 1st

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

模型.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())

标签: pythondjango

解决方案


您还需要保存order_item.item以更改项目数量:

order_item.item.item_quantity -= order_item.quantity
order_item.item.save()

但更优化的方法可以减少数据库命中:

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

更多信息可以在查询表达式update()查询文档中找到。


推荐阅读