Django - Убедитесь, что порядок данных ответа более новый первый

Ниже приведен код, который возвращает сообщения, более новые, чем сообщение с указанным post_uuid. Это обеспечивается тем, что я принудительно использую схему упорядоченных uuid, где каждому Post присваивается uuid в порядке создания, это делается с помощью ulid. Я хочу добиться того, чтобы возвращаемые serializer.data были упорядочены по данным о создании Post, причем самый новый был первым или индекс=0, а самый старый - последним. Как мне это обеспечить?

view.py

def query_to_full_post_data_serializer(request, post_query_set: QuerySet):
    query_set_annotated = post_query_set.annotate(
        creator_username=F('creator__username'),
        creator_avatar_url=F('creator__avatar')
    )
    return FullPostDataSerializer(query_set_annotated, many=True)

@api_view(['GET'])
def get_newer_posts(request, post_uuid, count):
    query = generate_followee_or_join_goal_follow_query(request)
    query = query & Q(uuid__gt=post_uuid)
    serializer = query_to_full_post_data_serializer(request=request, post_query_set=Post.objects.filter(query).order_by('uuid')[:count])
    return Response(serializer.data, status=status.HTTP_200_OK)

serializer.py

class FullPostDataSerializer(serializers.ModelSerializer):
    creator_username = serializers.SlugField()
    creator_avatar_url = serializers.SlugField()

    class Meta:
        model = Post
        fields = (
            'body', 'created', 'creator_username', 'uuid', 'creator', 'creator_avatar_url')

Опробованные решения

-

serializer.data.reverse()

по какой-то причине не разворачивает список.

  • попытался order_by на срезе, но это не разрешено Django
  • .

serializer.data является свойством, поэтому вызов .reverse() на нем, не сработает, так как вы отменяете результат свойства, но следующий вызов serializer.data снова вызовет свойство, которое построит новый список.

Таким образом, вы получаете данные, а затем обращаете их и передаете как результат:

items = serializer.data
items.reverse()
return Response(items, status=status.HTTP_200_OK)
Вернуться на верх