• <small id="ck0wk"><meter id="ck0wk"><menuitem id="ck0wk"></menuitem></meter></small>

  • <big id="ck0wk"></big>

  • 鍍金池/ 問答/Python  網絡安全/ django使用mysql保存數據出錯。

    django使用mysql保存數據出錯。

    求教大神!在做django關于商城訂單提交時出現錯誤: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():
                    # 使用事務進行庫存的刪減,當其中一項出現錯誤時,則所有操作都將回原。
                    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)
    回答
    編輯回答
    墻頭草

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

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

    試試下面這個:

    try:
        #do try
    except:
        #do except...
    save() #in here.
    2017年2月23日 02:12
    男生女生一起差差差带痛声,插曲的痛的视频30分钟,男生和女生在一起差差的视频