Python Django rest框架:在ModelSerializer中重写create(),传递额外参数

Python Django rest框架:在ModelSerializer中重写create(),传递额外参数,python,django,django-rest-framework,overriding,Python,Django,Django Rest Framework,Overriding,我正在寻找一种方法来正确地克服Django Rest框架中处理额外参数的ModelSerializer序列化程序的默认.create()方法 在我最初的Django模型中,我刚刚覆盖了默认的.save()方法,用于管理额外的参数。现在.save()也可以这样调用:.save(extra='foo') 我必须在原始Django模型上创建一个ModelSerializer映射: from OriginalModels.models import OriginalModel from rest_fra

我正在寻找一种方法来正确地克服Django Rest框架中处理额外参数的
ModelSerializer
序列化程序的默认
.create()
方法

在我最初的Django模型中,我刚刚覆盖了默认的
.save()
方法,用于管理
额外的
参数。现在
.save()
也可以这样调用:
.save(extra='foo')

我必须在原始Django模型上创建一个
ModelSerializer
映射:

from OriginalModels.models import OriginalModel
from rest_framework import serializers

class OriginalModelSerializer(serializers.ModelSerializer):

    # model fields
    class Meta:
        model = OriginalModel
但是这样我就不能将
extra
参数传递给model
.save()
方法


我如何正确地重写我的
原始模型序列化程序
类的
.create()
方法来考虑(最终)这个
额外的
参数?

嗯。这可能不是一个完美的答案,因为我不知道如何传递这个“额外的”(即,它通常是表单中的额外字段,等等)

您可能想要做的是将foo表示为序列化程序上的一个字段。然后它将出现在
create
中的
validated\u data
中,然后您可以让
create
执行以下操作

def create(self, validated_data):
    obj = OriginalModel.objects.create(**validated_data)
    obj.save(foo=validated_data['foo'])
    return obj

您可能希望查看create的默认实现,了解它所做的其他一些事情(如删除多对多关系等)

您现在可以在视图集中执行此操作(作为奖励,将用户添加进来;):

这样序列化程序就可以保持通用性,即:

class OriginalModelSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = OriginalModel
        fields = '__all__'

问题是“额外”参数不是我的
OrginalModel
的字段。据我所知,如果一个
ModelSerializer
字段没有映射到
OrginalModel
的任何常规字段,那么没有办法将其添加到
originalmodel
中。在将其传递给模型构造函数之前,您需要从
validated\u data
中弹出
foo
字段,然后,这个答案应该有效。请确保包括ModelSerializer“”create”方法中定义的所有其他代码:否则,使用上述代码,您将丢失一些预定义的功能。何时将此逻辑放入视图、序列化器、模型管理器甚至信号中?何时需要分离这些功能。我使用视图,因为它允许多个视图使用同一个序列化程序。我对模型有点严格,因为模型中的逻辑应该适用于整个系统——REST是一个特定的用例。信号实际上是用于解耦的——这对于这个应用程序来说可能太多了,信号也会使支持变得复杂,在不增加支持负担的情况下,我有足够的工作要做。但是,有不止一种方法可以做到这一点。
class OriginalModelSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = OriginalModel
        fields = '__all__'