django mysql object_django使用mysql保存数据出错。

在使用Django操作MySQL数据库保存OrderMain对象时遇到异常:save() prohibited to prevent data loss due to unsaved related object 'order'。问题出现在尝试更新订单状态时,由于相关对象未保存导致无法执行save()。解决方案可能涉及检查并保存相关联的对象,确保在事务中正确处理库存减量和订单状态更新。
摘要由CSDN通过智能技术生成

求教大神!在做django关于商城订单提交时出现错误:save() prohibited to prevent data loss due to unsaved related object 'order'.

实在找不到原因。。希望哪位大大可以帮下。。

详细截图:

619ae66306d6a17c5a70e7c34efc3c5f.png

4cd065fce8022e09720737d93a0bfd00.png

视图:

class ShowOrder(View):

def get(self, request, oid):

print(u'hello')

order_main = OrderMain.objects.get(pk=oid)

address = DeliveryAddress.objects.filter(user=request.user).all()

order_detail = OrderDetail.objects.filter(order=order_main).all()

return render(request, 'shop_order/place_order.html', locals())

def post(self, request, oid):

order_main = OrderMain.objects.get(pk=oid)

order_detail = OrderDetail.objects.filter(order=order_main).all()

address_id = request.POST.get('address_id')

print(address_id)

address = DeliveryAddress.objects.get(pk=address_id)

try:

with transaction.atomic():

# 使用事务进行库存的删减,当其中一项出现错误时,则所有操作都将回原。

for detail in order_detail:

# 如果库存不足则跑出异常

if detail.count < detail.goods_info.stock:

raise StockException(u'%s库存不足' % detail.goods_info)

detail.goods_info.stock = F('stock') - detail.count

detail.goods_info.save()

order_main.receiver = address

order_main.is_pay = '1'

##############################

# 代码就是下面这个save出错的 #

##############################

order_main.save()

return

except StockException:

order_main.is_pay = '-1'

order_main.save()

message = u'已下单,5秒后跳转至付款界面,您也可以点击这里进行跳转'

return render(request, 'shop_order/message.html', locals())

数据库:

# 生成对应订单

class OrderMain(models.Model):

order_status = (

('-1', '取消'),

('0', '创建'),

('1', '未支付'),

('2', '已支付'),

('3', '代发货'),

('4', '已发货')

)

uuid = models.CharField(max_length=50, unique=True, verbose_name=u'订单编号')

order_time = models.DateTimeField(auto_now_add=True, verbose_name=u'订单提交时间')

pay_time = models.DateTimeField(null=True, blank=True, verbose_name=u'付款时间')

user = models.ForeignKey(UserProFiles, verbose_name=u'购买用户')

total = models.DecimalField(null=True, max_digits=10, decimal_places=2, verbose_name=u'总价格')

is_pay = models.CharField(max_length=5, choices=order_status, default='0', verbose_name=u'订单状态')

receiver = models.ForeignKey(DeliveryAddress, null=True, verbose_name=u'收货详情')

class Meta:

verbose_name = u'订单中心'

verbose_name_plural = verbose_name

ordering = ('-id',)

def __str__(self):

return str(self.user) + str(self.order_id)

# 订单详情信息

class OrderDetail(models.Model):

order = models.ForeignKey(OrderMain, verbose_name=u'订单')

goods_info = models.ForeignKey(GoodsInfo, verbose_name=u'商品')

goods_price = models.DecimalField(max_digits=10, null=True, decimal_places=2, verbose_name=u'商品价格')

goods_total = models.DecimalField(default=0, max_digits=10, decimal_places=2, verbose_name=u'商品总价')

count = models.IntegerField(verbose_name=u'购买商品数量')

class Meta:

verbose_name=u'订单详情'

verbose_name_plural = verbose_name

ordering =('-id',)

def __str__(self):

return str(self.order) + str(self.goods_info)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值