Django - обрабатывать несколько разных уровней гнездо модели - PullRequest
1 голос
/ 17 февраля 2020

У меня есть вопрос о django вложенной модели.

Как я знаю, для обработки вложенной структуры данных я должен десериализовать все данные, а затем создать объект, который будет связан с ForeignKeyField.

Я мог бы справиться с этим, переопределив метод .create(), разделив все вложенные данные на .pop() и создав каждую объектную модель отдельно. Вот пример того, как я обрабатываю вложенные данные 2 уровня (на основе документации: Документация DRF )

def create(self, validated_data):
    child_data = validated_data.pop('child_data')
    parent_obj = ParentModel.objects.create(**validated_data)
    for data in child_data:
        ChildModel.objects.create(parent_id=parent_obj, **data)
    return parent_obj

У меня возникли некоторые проблемы. У меня есть многоуровневая структура данных, возможно, как данные ниже:

    "data_a": [
        {
            "data_a_1": [
                {
                    "data_a_1_1": [
                        {
                            "data_a_1_1_1": "example_a_1_1_1",
                            "data_a_1_1_2": "example_a_1_1_2"
                        }
                    ]
                },
                {
                    "data_a_1_2_1": "Example a-1-2-1",
                    "data_a_1_2_2": "Example a-1-2-2"
                }
            ]
            "data_a_2": [
                {
                    "data_a_2_1": "Example a-2-1"
                },
                {
                    "data_a_2_2": "Example a-2-2"
                }
            ]
        }
    ]

Мой вопрос:

  1. Каков наилучший способ обработки динамических c структура данных, как это? Для обработки нескольких многоуровневых структур данных потребуется длинный жестко заданный сценарий путем переопределения .create(), как я упоминал выше.
  2. Есть ли еще какие-либо рекомендации по обработке упомянутой структуры данных?

1 Ответ

0 голосов
/ 17 февраля 2020

Я нашел решение для этой структуры.

Я прочитал в Документации DRF, есть сторонний пакет для легкой обработки отношения родитель-потомок drf-writable-nested

Мне очень помогает справиться с такой проблемой структуры данных без жестко заданных .create() и .update(). Этот пакет предоставляет специальный метод для обработки проблемы CRUD «родитель-потомок», как я упоминал выше.

Вот пример:

models.py:

class GrandChildModel(models.Model):
    name = models.CharField(max_length=32, blank=True, null=True)
    parent_id = models.ForeignKeyField(ChildModel, on_delete=CASCADE, related_name='grandchild')

class ChildModel(models.Model):
    name = models.CharField(max_length=32, blank=True, null=True)
    parent_id = models.ForeignKeyField(ParentModel, on_delete=CASCADE, related_name='child')

class ParentModel(models.Model):
    parent_name = model.CharField(max_length=32, blank=True, null=True)

serializer.py

from drf_writable_nested.serializers import WritableNestedModelSerializer

class GrandChildSerializer(serializers.ModelSerializer):
    class Meta:
        model=GrandChildModel
        fields = ["name"]

class ChildSerializer(WritableModelSerializer):
    grandchild = GrandChildSerializer(many=True)
    class Meta:
        model=ChildModel
        fields = ["name", "grandchild"]

class ParentSerializer(WritableModelSerializer):
    child = ChildSerializer(many=True)
    class Meta:
        model=ChildModelimport 
        fields = ["name", "child"]

с этим вы можете обрабатывать все виды вложенных данных:)

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