У меня есть следующие models.py :
class Category(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100, blank=False)
class Movie(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100, blank=False)
category = models.ForeignKey(Category,related_name='movies',
on_delete=models.CASCADE,
blank=True,
null=True)
Как видите, между двумя классами существует отношение ForeignKey. Категория может иметь несколько фильмов, но фильм принадлежит только одной категории. Мой serializers.py выглядит следующим образом:
class CategorySerializer(serializers.HyperlinkedModelSerializer):
movies = MoviesSerializer(many=True, read_only=True)
class Meta:
model = Category
fields = ('url','id','created','name', 'movies')
class MovieSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Movie
fields = ('url','id','created','name', 'category')
Итак, у меня есть вложенные сериализаторы. Когда я десериализирую содержимое категорий, тогда я также показываю вложенные фильмы в выводе JSON, как я и ожидал. Но он показывает мне ALL фильмы, относящиеся к определенной категории в выводе JSON. Как я могу ограничить это число?
Я попытался это решение, но оно не сработало для меня, потому что я использую serializer.HyperlinkedModelSerializer . В этом предложенном решении они использовали serializers.ModelSerializer . Я получил эту ошибку, когда попробовал это решение:
AssertionError: `HyperlinkedIdentityField` requires the request in the serializer context. Add `context={'request': request}` when instantiating the serializer.
ОБНОВЛЕНИЕ: Вот мои views.py :
class AllCategories(generics.ListAPIView):
'''
This class class-based view lists
all the categories created
'''
serializer_class = CategorySerializer
queryset = Category.objects.all()
def list(self, request, *args, **kwargs):
'''
standard method that we override just to
put the string 'allCategories' before the dataset
'''
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
# the only part we change
return Response({'allCategories': serializer.data})
class AllMovies(generics.ListAPIView):
'''
This class lists all the movies
'''
# define the serializer class
serializer_class = MovieSerializer
queryset = Movie.objects.all()
def list(self, request, *args, **kwargs):
'''
standard method that we override just to
put the string 'allMoviesOfUser' before the dataset
'''
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
# the only part we change
return Response({'allMoviesOfUser': serializer.data})