Сериализатор Rest Framework для создания родительского и одного из нескольких дочерних типов - PullRequest
0 голосов
/ 27 января 2019

У меня есть сериализатор, который создает родительскую модель, а затем создает дочернюю модель в зависимости от некоторой информации, предоставленной родителю:

class InitializeFormSerializer(serializers.Serializer):
    title = serializers.CharField()
    category = serializers.ChoiceField(choices=CATEGORY_TYPES)

    def create(self, validated_data, user):
        identifier = validated_data.get('title')

        obj, created = Parent.objects.update_or_create(
            user=user,
        )

        if created:
            item_type = validated_data.get('item_type')
            if item_type == 'FIRST_TYPE':
                Child1.objects.create(identifier=obj)
            elif item_type == 'SECOND_TYPE':
                Child2.objects.create(identifier=obj)

        return obj

Это работает, но проверка item_type выглядит неуклюжей.Есть ли в Django или Rest Framework парадигма, которую я пропускаю, которая могла бы сделать это более элегантным?

EDIT : Под элегантностью я подразумеваю, что это очень вручную и плохо масштабируется.Я предполагаю, что мой вопрос заключается в том, предоставляет ли Django или Rest Framework встроенный метод для создания типа дочерней модели в родительском сериализаторе.

1 Ответ

0 голосов
/ 27 января 2019

Когда мне нужно реализовать метод, стратегия которого должна варьироваться в зависимости от параметра, я обычно использую этот шаблон.Это упрощает масштабируемость, потому что вам нужно только добавить ключи в словари стратегий (в данном случае children_types).В вашем случае это модели, но они могут быть методами, лямбдами или чем-то еще.

class InitializeFormSerializer(serializers.Serializer):
    title = serializers.CharField()
    category = serializers.ChoiceField(choices=CATEGORY_TYPES)

    def create(self, validated_data, user):
        children_types = {
            'FIRST_TYPE': Child1,
            'SECOND_TYPE': Child2,
        }

        identifier = validated_data.get('title')

        obj, created = Parent.objects.update_or_create(
            user=user,
        )

        if created:
            item_type = validated_data.get('item_type')
            children_types[item_type].objects.create(identifier=obj)

        return obj

Надеюсь, это полезно.

...