余分なパラメーターを処理するためのDjango Rest FrameworkのModelSerializer
シリアライザーのデフォルト.create()
メソッドを適切にovverrideする方法を探しています。
私の元のDjangoモデルでは、extra
パラメータを管理するためのdefault.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
パラメータをモデルの.save()
メソッドに渡すことができません。
OriginalModelSerializer
クラスの.create()
メソッドを適切にオーバーライドして、このextra
パラメータを(最終的に)考慮に入れるにはどうすればよいですか?
うーん。この「追加」をどのように渡したいのかわからないので、これは完全な答えではない可能性があります(つまり、フォームの追加フィールドなどです)。
おそらく、やりたいことは、シリアライザのフィールドとしてfooを表すことだけです。その後、validated_data
in create
、次にcreate
に次のようなことをさせることができます
def create(self, validated_data):
obj = OriginalModel.objects.create(**validated_data)
obj.save(foo=validated_data['foo'])
return obj
ただし、多対多の関係を削除するなど、他のいくつかのことについては、createのデフォルトの実装を確認することをお勧めします。
これをビューセットで行うことができます(ボーナスとしてユーザーに投げられました;)):
class OriginalModelViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows OriginalModel classes to be viewed or edited.
"""
serializer_class = OriginalModelSerializer
queryset = OriginalModel.objects.all()
def perform_create(self, serializer):
user = None
if self.request and hasattr(self.request, "user"):
user = self.request.user
serializer.save(user=user, foo='foo')
そうすれば、シリアライザは汎用性を保つことができます。つまり、
class OriginalModelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OriginalModel
fields = '__all__'