Задать вопрос
sergey_1990
@sergey_1990
1

Как обернуть ответ ListCreateAPIView рекурсивной модели в data?

Пытаюсь рефакторить код, как изменить формат ответа ListCreateAPIView и обернуть его в data

# class CategoryList(APIView):
#     """List all categories, or create a new category"""
#     @extend_schema(
#         responses={201: CategoryTreeSerializer},
#     )
#     def get(self, request, format=None):
#         categories = Category.objects.filter(level=0)
#         serializer = CategoryTreeSerializer(categories, many=True)
#         # return Response(serializer.data)
#         return Response({"success": True, "message": "Категории успешно получены", "data": serializer.data})
#
#     @extend_schema(
#         request=CategoryTreeSerializer,
#         responses= {201: CategoryTreeSerializer,
#                     400: as_serializer_error},
#     )
#     def post(self, request, format=None):
#         print(request.data)
#         serializer = CategoryTreeSerializer(data=request.data, context={'data': request.data})
#         if serializer.is_valid():
#             serializer.save()
#             return Response(serializer.data, status=status.HTTP_201_CREATED)
#         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
#

class CategoryList(generics.ListCreateAPIView):
    queryset = Category.objects.filter(level=0)
    serializer_class = CategoryTreeSerializer


закомментированный код рабочий но так гораздо короче, сериализатор:
class CategoryTreeSerializer(serializers.Serializer):
    """РАБОТАЕТ С МОДЕЛЬЮ КАТЕГОРИИ"""
    name = serializers.CharField(validators=[UniqueValidator(queryset=Category.objects.all())])
    id = serializers.IntegerField(allow_null=True)
    tree_id = serializers.IntegerField(read_only=True)
    level = serializers.IntegerField(read_only=True)
    parentId = serializers.IntegerField(source='parent.id', allow_null=True, read_only=True)
    children = RecursiveField(required=False, allow_null=True, many=True, read_only=True)
    def create(self, data):
        parent_id=data.get('id')
        name = data.get('name')
        try:
            parent = Category.objects.get(id=parent_id)
        except:
            parent=None
        return Category.objects.create(name=name, parent=parent)

    # def to_representation(self, instance):
    #         data = super().to_representation(instance).copy()
    #         data = {"data":data}
    #         return data


здесь закоментированное дает
[
    {
        "data": {
            "name": "Переговоры. Презентации",
            "id": 10,
            "tree_id": 1,
            "level": 0,
            "parentId": null,
            "children": []
        }
    },
    {
        "data": {
            "name": "Торговый маркетинг",
            "id": 11,
            "tree_id": 2,
            "level": 0,
            "parentId": null,
            "children": [
                {
                    "data": {
                        "name": "Планирование реклама",
                        "id": 13,
                        "tree_id": 2,
                        "level": 1,
                        "parentId": 11,
                        "children": []
                    }
                },
т.е. каждый объект оборачивает
  • Вопрос задан
  • 62 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы