Как получить данные модели, имеющие вложенные отношения, используя сериализаторы в Django Rest Framework? - PullRequest
0 голосов
/ 15 сентября 2018

Я подробно объясняю проблему, с которой сталкиваюсь, и обращаюсь за помощью к этому сообществу. Я следовал этой документации Django Rest Framework , но не смог получить желаемый результат для многоуровневого вложения

Рассмотрим взаимосвязь моделей как объяснено:

  1. Пользователь может иметь несколько рабочих областей
  2. В рабочей области может быть несколько проектов
  3. Проект может иметь несколько списков проектов
  4. ProjectList может иметь несколько задач
  5. Задачи могут иметь несколько обновлений

User | Workspaces (ForeignKey="User") |____Projects (ForeignKey="Workspaces") |____TodoList (ForeignKey="Projects") |____Tasks (ForeignKey="TodoList") |____Updates (ForeignKey="Tasks")

Итак, я хочу получить все данные, которые есть у пользователя, в формате json:

[
    {
        "workspace_id": "99a961ec-b89e-11e8-96f8-529269fb1459",
        "workspace_owner": "1",
        "workspace_title": "Indie Dev Works",
        "projects": [
            {
                "project_id":"db09cfa0-b89e-11e8-96f8-529269fb1459",
                "todo_list":[
                    {
                        "list_id": "9dc64e4c-b89f-11e8-96f8-529269fb1459",
                        "list_name":"Project list -1",
                        "tasks":[
                            "task_name":"Create HTML docs",
                            "updates":[
                                {
                                    "id":"d5eb660e-b89f-11e8-96f8-529269fb1459",
                                    "text":"Creating using PUG"
                                },
                                {
                                    .....
                                    .....
                                    .....
                                    .....

                                },

                            ]

                        ]
                    }
                ]

            },

            {
                "project_id":".........",
                ....
                ....
                ....
                ..
                ..
                .


            },
        ]

    }
]

Поэтому, когда мой пользователь входит в систему, вводя электронную почту, я пытаюсь получить все экземпляры Workspaces и затем передать их сериализаторам. на мой взгляд, как указано ниже:

views.py

class InitializeHome(viewsets.ViewSet):

    def list(self,request):
        user_email = request.user.email
        user_instance = utils.getUserInstance(user_email)
        workspace_instance = WorkSpace.objects.filter(workspace_owner=user_instance)

        testing_serializer = WorkSpaceSerializer(workspace_instance,many=True)
        return Response(testing_serializer.data)

serializers.py

class UpdateSerializer(serializers.ModelSerializer):

    class Meta:
        # depth = 2        
        fields = '__all__'
        model = Update


class TaskSerializer(serializers.ModelSerializer):
    updates = UpdateSerializer(many=True,read_only=True)
    class Meta:
        # depth = 2        
        fields = '__all__'   
        model = Task


class ProjectTodoListSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True,read_only=True)
    class Meta:
        # depth = 2        
        fields =  '__all__'
        model = ProjectTodoListItem


class ProjectSerializer(serializers.ModelSerializer):


    project_todo_list = ProjectTodoListItemSerializer(many=True,read_only=True)                
    class Meta:
        # depth = 2        
        fields = '__all__'
        model = Project


class WorkSpaceSerializer(serializers.ModelSerializer):

    projects = ProjectSerializer(many=True,read_only=True)
    class Meta:
        # depth = 2

        model = WorkSpace
        fields = '__all__'

Я получаю только это и ни один из вложенных массивов:

[
    {
        "id": 1,
        "workspace_title": "Indie Dev Work",
        "status": "ACTIVE",
        "workspace_id": "26c60d80-c018-403c-84b2-d92f01f6fb7e",
        "workspace_owner": 1
    },
    {
        "id": 2,
        "workspace_title": "Homework Space",
        "status": "ACTIVE",
        "workspace_id": "08c715cc-bd24-46d3-a1dd-14cf7ff28215",
        "workspace_owner": 1
    }
]

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Нашел ответ.Добавив source="workspace_set" в все классы сериализатора, можно достичь результатов: -

class WorkSpaceSerializer(serializers.ModelSerializer):

    projects = ProjectSerializer(many=True,read_only=True,source="workspace_set")
    class Meta:
        # depth = 2

        model = WorkSpace
        fields = '__all__'
0 голосов
/ 15 сентября 2018

Вы тоже можете попробовать это:

class WorkSpaceSerializer(serializers.ModelSerializer):

    class Meta:
        # depth = 2

        model = WorkSpace
        fields = '__all__'

    def get_projects(self, obj): # get_YOUR_FIELD_NAME
        return ProjectSerializer(obj.projects.all(), many=True).data

и то же самое для других классов.

Я не уверен, почему ваш код не работает, и я не могу сейчас его проверить, но вы можете попробовать назвать поля в своем метаклассе (это не должно иметь никакого значения, но вы можете попробовать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...