【问题标题】:Getting Error While Saving Recovery Model In Django在 Django 中保存恢复模型时出错
【发布时间】:2021-12-03 15:44:21
【问题描述】:

我遇到错误

django.db.utils.IntegrityError: UNIQUE 约束失败:app_recovery.id

同时保存我的恢复模型。

我在 PostMen 上发送了带有数据的 POST 请求

{'party': 1, 'party_order': '2', 'sale_officer': 1, 'payment_method': '清算','银行':'','金额':'500000','描述':'集团 恢复'}

它提出了 UNIQUE 约束但保存了数据。

我的模特:

class Recovery(models.Model):
    date = models.DateField(default=timezone.now, blank=True)
    party = models.ForeignKey(Party,on_delete=models.CASCADE)
    status = models.CharField(max_length=50, choices=[('Pending', 'Pending'), ('Approved','Approved')], default='Pending')
    party_order = models.ForeignKey(PartyOrder,on_delete=models.CASCADE,null=True,blank=True)
    sale_officer = models.ForeignKey(SalesOfficer,on_delete=models.CASCADE)
    payment_method = models.CharField(max_length=20,choices=(('Cash','Cash'),('Bank','Bank'),('Clearing','Clearing'))) 
    bank = models.ForeignKey(Bank,on_delete=models.CASCADE,null=True,blank=True)
    amount = models.FloatField()
    description = models.CharField(max_length=50)

    pl = models.ForeignKey(PartyLedger,on_delete=models.CASCADE,null=True,blank=True)
    bl = models.ForeignKey(BankLedger,on_delete=models.CASCADE,null=True,blank=True)
    cl = models.ForeignKey(CashLedger,on_delete=models.CASCADE,null=True,blank=True)
    cll = models.ForeignKey(ClearingLedger,on_delete=models.CASCADE,null=True,blank=True)

    def _str_(self):
        return str(self.id) + ':' + self.sale_officer.name

    
    def save(self, *args, **kwargs):
        if self.id == None:
            super(Recovery, self).save(*args, **kwargs)
        if self.party_order:
            order = PartyOrder.objects.get(id=self.party_order.id)
            order.pandding_amount -= self.amount
            order.save()
        else:
            if self.status == 'Approved':
                if self.party_order:
                    pl = PartyLedger(party=self.party,sales_officer=self.sale_officer, 
                                freight = self.party_order.freight,transaction_type='Credit',
                                description=self.description,
                                total_amount=self.amount)
                    pl.save()                 
                else:
                    pl = PartyLedger(party=self.party,sales_officer=self.sale_officer, 
                                    transaction_type='Credit',
                                    description=self.description,
                                    total_amount=self.amount)
                    pl.save()
                self.pl = pl
                
                if self.payment_method == 'Bank':
                    bl = BankLedger(bank=self.bank,transaction_type='Debit',
                                    description=self.description,
                                    total_amount=(self.amount))
                    bl.save()
                    self.bl = bl
                elif self.payment_method == 'Cash':
                    cl = CashLedger(transaction_type='Debit',
                                    description=self.description,
                                    total_amount=(self.amount))
                    cl.save()
                    self.cl = cl
                elif self.payment_method == 'Clearing':
                    ccl = ClearingLedger(transaction_type='Debit',
                                description=self.description,
                                total_amount=(self.amount))
                    ccl.save()
                    self.cll = ccl
        super(Recovery, self).save(*args, **kwargs)

序列化器:

class RecoverySerializer(serializers.ModelSerializer):
    class Meta:
        model = m.Recovery
        fields = '_all_'

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['bank'] = BankSerializer(instance.bank).data
        response['party'] = PartySerializer(instance.party).data
        response['party_order'] = PartyOrderSerializer(instance.party_order).data
        response['sale_officer'] = SalesOfficerSerializer(instance.sale_officer).data
        return response

查看:

class RecoveryViewSet(viewsets.ViewSet):
                        def create(self, request):
        # if request.user.is_superuser or p.SalesOfficer(request):
        if request:
            # try:
            serializer = s.RecoverySerializer(
                data=request.data, context={"request": request})
            print(request.data)
            serializer.is_valid(raise_exception=True)
            # print(serializer.errors)
            serializer.save()
            print(serializer.errors)
            dict_response = {"error": False,
                            "message": "Data Save Successfully"}
            # except ValueError as err:
            #     dict_response = {"error": True, "message": err}
            # except:
            #     dict_response = {"error": True,
            #                     "message": "Error During Saving Data"}

        return JsonResponse(dict_response)

【问题讨论】:

    标签: python django api django-rest-framework


    【解决方案1】:

    问题在于保存方法的最后一行:-

    super(Recovery, self).save(*args, **kwargs)
    

    您应该获取恢复对象,然后对该对象执行保存操作。

    def save(self, *args, **kwargs):
        if self.id == None:
            super(Recovery, self).save(*args, **kwargs)
        else:
            recovery = Recovery.objects.get(id=self.id)
             ...
             ...
    
             recovery.save()
    

    【讨论】:

      【解决方案2】:
      if self.id == None:
              super(Recovery, self).save(*args, **kwargs)
          else:
              recovery = Recovery.objects.get(id=self.id)
               ...
               ...
      
      super(Recovery, self).save(*args, **kwargs) <--- remove from here
          super(Recovery, self).save(*args, **kwargs) <--- place it in else condition
      

      【讨论】:

        猜你喜欢
        • 2019-03-29
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 2019-11-25
        • 2012-03-16
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        相关资源
        最近更新 更多