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 ничего не значит