Django Rest Framework - Почему serializer.data дает мне пустой набор результатов, но печать сериализатора показывает мне данные

Я создал представление для поиска постов на основе их основного текста. Я добавил точку останова в представление и протестировал его с несколькими условиями поиска, и оно работает. Проблема в том, что когда я делаю print(serializer) в консоли, я вижу данные всех найденных постов. Но при выполнении print(serializer.data) я получаю body:null в объекте данных в консоли передней части и пустой словарь в консоли задней части.

Почему я получаю body: null?

Вот ответ в консоли для print(serializer):

SearchSerializer(<QuerySet [<Post: This is a post>, <Post: This is another post>, <Post: Post THREE>, <Post: Post ONE>, <Post: Post ONE by the user>, <Post: Post TWO by the user>]>):
    body = CharField(allow_blank=True, allow_null=True, label='Content', max_length=5000, required=False, style={'base_template': 'textarea.html'})

Вот вид:

class SearchPosts(APIView):
    permission_classes = [IsAuthenticated]    

    def post(self, request, *args, **kwargs):
        term = request.data.get("term")
        posts = Post.objects.filter(body__search=term)
        serializer = SearchSerializer(posts)
        breakpoint()
        return Response(serializer.data, status=HTTP_200_OK)

Вот сериализатор:

class SearchSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = [
            'body'
        ]

Вот модель поста:

class Post(models.Model):

    body = models.TextField("content", blank=True, null=True, max_length=5000)
    slug = AutoSlugField(populate_from=["category", "created_at"])
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="posts")
    published = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "post"
        verbose_name_plural = "posts"
        db_table = "posts"
        ordering = ["created_at"]
        get_latest_by = "created_at"

    def __str__(self):
        return self.body[0:30]

    def get_absolute_url(self):
        return self.slug

Как мне потом получить данные в front end?

  def get(self, request, format=None):
        all_objects = Model.objects.all()
        serializer = YourSerializer(all_objects, many=True)
        return Response(serializer.data)

вы пропустили функцию get пожалуйста, обратитесь к документации https://www.django-rest-framework.org/tutorial/3-class-based-views/

Вы, вероятно, получили AttributeError при попытке получить serializer.data. Вы отправили в сериализатор объект Queryset, а не один экземпляр модели Post. Если вы хотите сериализовать несколько объектов, просто передайте many параметр как True. Из документации;

Чтобы сериализовать набор или список объектов вместо одного экземпляра объекта, необходимо передать флаг many=True при инстанцировании сериализатора.

Итак, измените свое использование следующим образом;

posts = Post.objects.filter(body__search=term)
serializer = SearchSerializer(posts, many=True)

попробуйте def get_serializer_class потому что в def post - serializer ничего не значит

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