2

Calling save() on a serializer is returning below error:

Original exception was:
Traceback (most recent call last):
File "C:\Users\aditya\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\rest_framework\serializers.py", line 940, in create

instance = ModelClass.objects.create(**validated_data)
File "C:\Users\aditya\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\aditya\AppData\Local\conda\conda\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 417, in create
obj.save(force_insert=True, using=self.db)
TypeError: save() got an unexpected keyword argument 'force_insert'

views.py

def post(self,request):
    if request.method=='POST':
        serializer = invoiceSerializers(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

model.py

class invoice(models.Model):
    customer = models.CharField(max_length=256, blank=False)
    date = models.DateField(default=now)
    invoice_number = models.IntegerField(editable=False,default=1)
    total_quantity = models.DecimalField(max_digits=10, decimal_places=2)
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    total_tax = models.DecimalField(max_digits=10, decimal_places=2)

    def save(self):
        if self._state.adding:
            last_invoice=invoice.objects.all().aggregate(largest=models.Max('invoice_number'))['largest']

            if last_invoice is not None:
                self.invoice_number=last_invoice+1
        super(invoice,self).save()

I am not able to understand why this is happening and how to fix this. Any help is appreciated.

1 Answer 1

3

The save() method of Model accepts few keyword arguments such as force_insert,using etc. But, you are not accepting those arguments in your override methods.

So change your save() method as

class invoice(models.Model):
    .....
    .....
    .....
    # your code
    def save(self, *args, **kwargs):
        .....
        .....
        .....
        # your code
        super(invoice, self).save(*args, **kwargs)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.