我有一个主序列化器,我的 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
您可以初始化序列化器,在 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 装饰器。您的方法不必是静态的