Django Rest框架序列化程序,用于创建父类型和多个子类型之一
我有一个序列化程序,它创建父模型,然后根据提供给父模型的某些信息创建子模型:Django Rest框架序列化程序,用于创建父类型和多个子类型之一,django,django-rest-framework,serialization,Django,Django Rest Framework,Serialization,我有一个序列化程序,它创建父模型,然后根据提供给父模型的某些信息创建子模型: class InitializeFormSerializer(serializers.Serializer): title = serializers.CharField() category = serializers.ChoiceField(choices=CATEGORY_TYPES) def create(self, validated_data, user): ide
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
这是可行的,但是项目类型
检查感觉很笨拙。在Django或Rest框架中是否有一个我遗漏的范例可以使它更优雅
编辑:所谓优雅,我的意思是这是非常手动的,并且不能很好地缩放。我想我的问题是,Django或Rest框架是否提供了一种内置方法来在父序列化程序中创建一种类型的子模型。当我必须实现一种策略必须根据参数而变化的方法时,我通常使用这种模式。它简化了可伸缩性,因为您只需将键添加到策略字典(在本例中为
children\u types
)。在您的例子中,它们是模型,但也可以是方法、lambda或其他任何东西
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
希望有用。
优雅
是一个选择。。。如果是这样,您可以添加这样的dictitems={'FIRST\u-TYPE':Child1,'SECOND\u-TYPE':Child2}
然后添加If-items.get(item\u-TYPE):items[item\u-TYPE].objects.create(identifier=obj)
,这样您就可以将If子句
减少为一个。这是真的-抱歉,我已经更新了这个问题,以澄清我所说的优雅是什么意思。我很可能会采用这种方法-如果您将此添加为答案,我会接受,谢谢。我明白了,您可以随时向您的家长模型添加post\u save
信号,并传递您的项目类型
,您可以处理记录的创建。