鍍金池/ 問答/Python  網(wǎng)絡安全/ django使用mysql保存數(shù)據(jù)出錯。

django使用mysql保存數(shù)據(jù)出錯。

求教大神!在做django關于商城訂單提交時出現(xiàn)錯誤:save() prohibited to prevent data loss due to unsaved related object 'order'.
實在找不到原因。。希望哪位大大可以幫下。。

詳細截圖:
圖片描述

圖片描述

視圖

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():
                # 使用事務進行庫存的刪減,當其中一項出現(xiàn)錯誤時,則所有操作都將回原。
                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秒后跳轉(zhuǎn)至付款界面,您也可以點擊這里進行跳轉(zhuǎn)'
        return render(request, 'shop_order/message.html', locals())

數(shù)據(jù)庫:

# 生成對應訂單
class OrderMain(models.Model):
    order_status = (
        ('-1', '取消'),
        ('0', '創(chuàng)建'),
        ('1', '未支付'),
        ('2', '已支付'),
        ('3', '代發(fā)貨'),
        ('4', '已發(fā)貨')
    )
    
    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'訂單狀態(tài)')
    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'購買商品數(shù)量')

    class Meta:
        verbose_name=u'訂單詳情'
        verbose_name_plural = verbose_name
        ordering =('-id',)

    def __str__(self):
        return str(self.order) + str(self.goods_info)
回答
編輯回答
墻頭草

看你的邏輯是通的,我也試了代碼可以跑。我猜測是數(shù)據(jù)庫的問題,你的數(shù)據(jù)庫外鍵關聯(lián)沒做on_delete=True,可能導致保存一個模型對象的時候,外鍵關聯(lián)的需要值卻沒有,其它的看不出什么來了,只能幫你到這了。 話說這是公司代碼?還是自己寫了學習的。

2018年1月7日 22:06
編輯回答
菊外人

試試下面這個:

try:
    #do try
except:
    #do except...
save() #in here.
2017年2月23日 02:12