Пытаюсь рефакторить код, как изменить формат ответа 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": []
}
},
т.е. каждый объект оборачивает