Python Django rest框架:在ModelSerializer中重写create(),传递额外参数
我正在寻找一种方法来正确地克服Django Rest框架中处理额外参数的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
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__'