Сериализация кверисета модели, показывающего пустой [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):

Это сработало

Вернуться на верх