Сериализация кверисета модели, показывающего пустой [OrderedDict()].
Я создаю приложение для блога с React
и Django
и я сериализую экземпляры модели, сохраненные определенным пользователем, Сначала я просто пытаюсь протестировать с .all()
, затем я планирую фильтровать по определенному пользователю Но когда я сериализую набор запросов с помощью сериализатора, например :-
class BlogSerializerApiView(viewsets.ModelViewSet):
serializer_class = BlogSerializer
def get_queryset(self, *args, **kwargs):
queryset = Blog.objects.all()
output_serializer = BlogSerializer(queryset, many=True)
print(output_serializer.data)
return "Testing"
он отображается в консоли :-
[OrderedDict(), OrderedDict()]
и когда я обращаюсь к нему как
print(output_serializer)
тогда он показывает
BlogSerializer(<QuerySet [<Blog: user_1 - Blog_title>, <Blog: user_2 - second_blog_title>]>, many=True):
serializer.py
class BlogSerializer(serializers.Serializer):
class Meta:
model = Blog
fields = ['title']
models.py
class Blog(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=30, default='')
def __str__(self):
return f"{self.user} - {self.title}"
Что я пытаюсь сделать
Я пытаюсь сериализовать queryset для отображения на странице в react frontend
, я буду связываться с конкретным пользователем позже.
Я много раз пытался изменить метод сериализации CBV
на generics.ListAPIView
вместо viewsets.ModelViewSet
, но все равно то же самое.
Любая помощь будет очень признательна. Заранее спасибо
Здесь присутствует концептуальная ошибка. Функция get_queryset
не должна возвращать сериализованные данные. Она должна возвращать QuerySet
объектов модели.
Для достижения желаемого вы можете просто сделать:
class BlogSerializerApiView(viewsets.ModelViewSet):
serializer_class = BlogSerializer
def get_queryset(self, *args, **kwargs):
return Blog.objects.all()
Фреймворк Django Rest Framework позаботится о сериализации данных.
На самом деле, вы можете сделать это гораздо проще. Определив поле queryset представления следующим образом:
class BlogSerializerApiView(viewsets.ModelViewSet):
queryset = Blog.objects.all()
serializer_class = BlogSerializer
Дополнительно:
Вы сказали, что будете связываться с текущим пользователем позже. Вы могли бы достичь этого в методе get_queryset
, фильтруя против пользователя
class BlogSerializerApiView(viewsets.ModelViewSet):
serializer_class = BlogSerializer
def get_queryset(self, *args, **kwargs):
return Blog.objects.filter(user_id=USER_ID)
Надеюсь, это поможет!
Я использовал
class BlogSerializer(serializers.Serializer):
.......
поэтому он показывал пустые результаты (без понятия почему, я думаю, это устарело)
После замены на
class BlogSerializer(serializers.HyperlinkedModelSerializer):
Это сработало