python - 从 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())
解决方案
您还需要保存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)
推荐阅读
- github - 为什么/如何在 Github 上将某些组织成员列为合作者
- angular - 未在标头组件上调用 NgOnInit
- node.js - try / catch vs then() / catch() for [err, result] = await promise
- angular - Jasmine - 无法读取未定义的属性“控件” - Angular 6
- reporting-services - 每行的 SSRS 设计表面字段
- python - 来自单个种子的多个独立随机数流
- scala - Scala - 如何列出对象向量的 2 个参数?
- python-asyncio - 为什么 StreamReader 无法在此代码中接收?
- angular - 错误类型错误:无法读取 Object.eval [as updateDirectives] 处未定义的属性“_id”
- go - Golang如何在Win10上缓存DNS?