Rest Framework序列化程序创建父级和多个子级类型之一

时间:2019-01-27 00:11:16

标签: django django-rest-framework serializer

我有一个序列化器,该序列化器创建父模型,然后根据提供给父模型的某些信息创建子模型:

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中是否有一个范例可以使它变得更加优雅?

编辑:优雅,我的意思是这是非常手工的,并且扩展性不好。我想我的问题是,Django或Rest Framework是否提供了用于在父序列化器中创建子模型类型的内置方法。

1 个答案:

答案 0 :(得分:1)

当我必须实现必须根据参数而变化的策略的方法时,我通常使用此模式。它简化了可伸缩性,因为您只需要向策略字典添加密钥(在本例中为df.to_sql(name='my table', con = engine, index=False, if_exists='append') ProgrammingError: ('42S22', "[42S22] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid column name 'Week 2'. (207) (SQLExecDirectW); [42S22] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid column name 'Week 2'. (207); [42S22] [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement(s) could not be prepared. (8180)") The above exception was the direct cause of the following exception: )。就您而言,它们是模型,但它们可以是方法,lambda或其他任何东西。

children_types

希望它有用。