Getting Error While Saving Recovery Model In Django

I am getting "django.db.utils.IntegrityError: UNIQUE constraint failed: app_recovery.id" Error while saving my Recovery Model: I sended POST request on PostMen with data

{'party': 1, 'party_order': '2', 'sale_officer': 1, 'payment_method': 'Clearing', 'bank': '', 'amount': '500000', 'description': 'Group Recovery'}

Its raised UNIQUE constraint but saved Data.

My Model :

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)

serializer:

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

view :

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)

Kindly help me to solve this problem

The issue is at the last line in your save method that is :-

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

instead of this you should get the recovery object and then perform the save operation on the object.

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()
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
Back to Top