web-dev-qa-db-ja.com

Django残りのフレームワーク:追加のパラメーターを渡してModelSerializerのcreate()をオーバーライドします

余分なパラメーターを処理するための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パラメータを(最終的に)考慮に入れるにはどうすればよいですか?

10
floatingpurr

うーん。この「追加」をどのように渡したいのかわからないので、これは完全な答えではない可能性があります(つまり、フォームの追加フィールドなどです)。

おそらく、やりたいことは、シリアライザのフィールドとして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のデフォルトの実装を確認することをお勧めします。

14
Alex T

これをビューセットで行うことができます(ボーナスとしてユーザーに投げられました;)):

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__'
3
davmor