【问题标题】:Problem on calling save() for post in django rest framework在 django rest 框架中为 post 调用 save() 的问题
【发布时间】:2018-09-09 12:41:40
【问题描述】:

在序列化程序上调用 save() 会返回以下错误:

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)

模型.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()

我无法理解为什么会发生这种情况以及如何解决这个问题。任何帮助表示赞赏。

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    Model 的 save() 方法接受很少的关键字参数,例如force_insertusing 等。但是,您在覆盖中不接受这些参数方法。

    因此,将您的 save() 方法更改为

    class invoice(models.Model):
        .....
        .....
        .....
        # your code
        def save(self, *args, **kwargs):
            .....
            .....
            .....
            # your code
            super(invoice, self).save(*args, **kwargs)

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2018-08-18
      • 2018-12-08
      • 2015-11-14
      相关资源
      最近更新 更多