1. ホーム
  2. django

[解決済み] Django Rest Framework の Viewset からシリアライザーにリクエストコンテキストを渡す。

2023-02-18 01:22:43

質問

シリアライザーのフィールドの値が、現在ログインしているユーザーのIDに依存するケースがあります。 シリアライザーを初期化する際にユーザーをコンテキストに追加する方法を見たことがありますが、ViewSetを使用する場合、シリアライザークラスのみを提供し、実際のシリアライザーインスタンスを提供しないため、これを行う方法がよくわかりません。

基本的には、どのようにしたらいいのか知りたいです。

class myModelViewSet(ModelViewSet):
   queryset = myModel.objects.all()
   permission_classes = [DjangoModelPermissions]
   serializer_class = myModelSerializer

になります。

class myModelSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.SerializerMethodField()
    special_field = serializers.SerializerMethodField()

    class Meta:
        model = myModel

    def get_special_field(self, obj):
        if self.context['request'].user.has_perm('something.add_something'):
           return something

分かりにくかったらすみません、DOCからです。 追加コンテキストの追加 を実行するように書かれています。

serializer = AccountSerializer(account, context={'request': request})
serializer.data

しかし、シリアライザクラスを変更するだけで、シリアライザインスタンス自体を変更することはできないので、ビューセットから自動的に行う方法がよくわからないのですが、どうすればよいでしょうか?

どのように解決するのでしょうか?

GenericViewSet には get_serializer_context メソッドがあり、このメソッドによって context :

class myModelViewSet(ModelViewSet):
    queryset = myModel.objects.all()
    permission_classes = [DjangoModelPermissions]
    serializer_class = myModelSerializer

    def get_serializer_context(self):
        context = super(myModelViewSet, self).get_serializer_context()
        context.update({"request": self.request})
        return context