如何将请求作为参数传递给序列化器方法字段中的序列化器

问题描述 投票:0回答:1

我有一个主序列化器,我的 BOOK 模型也有一个序列化器,所以我创建了一个使用我的 BOOK SERIALIZER

返回序列化查询集的方法

但问题是 ** 我无法通过 BookSerializer 访问我的主序列化器上下文**

我能做什么?

Views.py:

class BookMainPage(ListModelMixin, RetrieveModelMixin, GenericViewSet):
    queryset = Book.objects.select_related('owner').all()

    def get_serializer_context(self):
        return {'user': self.request.user, 'book_id': self.kwargs.get('pk'), 'request': self.request}

    def get_serializer_class(self):
        if self.kwargs.get('pk') is None:
            return MainPageSerializer
        return BookComplexSerializer

MainPageSerializer:

class MainPageSerializer(serializers.Serializer):
    @staticmethod
    def get_new_books(self):
        return BookSimpleSerializer(Book.objects.all().order_by('-created_at')[:10], many=True).data

    @staticmethod
    def get_popular_books(self):
        return BookSimpleSerializer(Book.objects.all().order_by('-bookRate')[:10], many=True).data

    @staticmethod
    def get_most_borrowed(self):
        return BookSimpleSerializer(Book.objects.all().order_by('-wanted_to_read')[:10], many=True).data

    new_books = serializers.SerializerMethodField(method_name='get_new_books')
    popular_books = serializers.SerializerMethodField(method_name='get_popular_books')
    most_borrowed_books = serializers.SerializerMethodField(method_name='get_most_borrowed')

BookSimpleSerializer:

class BookSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'picture']

    def get_picture(self, obj: Book):
        request = self.context['request']
        photo_url = obj.picture.url
        return request.build_absolute_uri(photo_url)

    picture = serializers.SerializerMethodField(method_name='get_picture')


class CategorySimpleSerializer(serializers.ModelSeria
django image django-rest-framework request django-serializer
1个回答
0
投票

您可以初始化序列化器,在 MethodField 方法中传递带有您的请求的上下文:

class MainPageSerializer(serializers.Serializer):
    def get_new_books(self):
        return BookSimpleSerializer(
            Book.objects.all().order_by('-created_at')[:10], 
            many=True, 
            context={"request": self.context["request"]}
        ).data

    def get_popular_books(self):
        return BookSimpleSerializer(
            Book.objects.all().order_by('-bookRate')[:10], 
            many=True, 
            context={"request": self.context["request"]}
        ).data

    def get_most_borrowed(self):
        return BookSimpleSerializer(
            Book.objects.all().order_by('-wanted_to_read')[:10], 
            many=True, 
            context={"request": self.context["request"]}
        ).data

    new_books = serializers.SerializerMethodField(method_name='get_new_books')
    popular_books = serializers.SerializerMethodField(method_name='get_popular_books')
    most_borrowed_books = serializers.SerializerMethodField(method_name='get_most_borrowed')

我删除了 staticmethod 装饰器。您的方法不必是静态的

© www.soinside.com 2019 - 2024. All rights reserved.