Как сделать динамический сериализатор полей в Django RestFramework

Я хочу добавить сериализатор массива динамических полей в свой drf-проект:

Мой ответ выглядит примерно так:

{
    "title": "some",
    "created_at": "2022-03-06T15:59:52.684469Z",
    "fields": [
        {
            "id": 1,
            "title": "Some title?",
            "parent_field": 1
        },
        {
            "id": 2,
            "title": "Yet another fields",
            "parent_field": 1
        }
    ]
}

Это сериализатор деталей элемента, а поля - это другой сериализатор модели. Я достиг этого, используя следующий код:


class AnotherFieldSerializer(serializers.ModelSerializer):
    class Meta:
        model = AnotherModel
        fields = "__all__"


class FirstSerializer(serializers.ModelSerializer):
    fields = serializers.SerializerMethodField()

    class Meta:
        model = FirstModel
        fields = "__all__"

    def get_fields(self, obj):
        serializer_context = {'request': self.context.get('request')}

        children = obj.fields
        if not children.exists():
            return None
        serializered_children = FirstSerializer(
            children,
            many=True,
            context=serializer_context
        )
        return serializered_children.data

Это работает только для GET запросов, я хочу, чтобы это также работало с POST и PUT запросами. Итак, представьте, что я хочу добавить/редактировать элемент в мою модель FIRST и добавить связанные с ним поля, просто отправив этот JSON:

{
    "title": "some",
    "created_at": "2022-03-06T15:59:52.684469Z",
    "fields": [
        {
            "id": 1,
            "title": "Some title?",
        },
        {
            "id": 2,
            "title": "Yet another fields",
        }
    ]
}

Я знаю, что могу получить поля из ответа и просмотреть каждый элемент, чтобы создать экземпляр другой модели, но проверка полей будет намного сложнее, я думаю. Но если есть более подробная информация о том, как это сделать, было бы здорово. Также, я не против сделать еще один сериализатор только для POST и PUT запросов.

Надеюсь, мой английский был понятен.

Вы можете создать новый сериализатор для валидации. Для валидации нескольких элементов вы можете сделать следующее,

class PostSerializer(serializers.Serializer):
    title = serializers.CharField(max_length=200)
    created_at = serializers.DateTimeField()
    fields = FirstSerializer(many=True) # your model serializer for the FirstModel 

Ref : https://www.django-rest-framework.org/api-guide/serializers/#listserializer

Вернуться на верх