我有一个模型,Parent包含与Parent.child中的各种子模型(ChildA,ChildB)的Django ContentType GenericForeignKey关系
我正在尝试使用此设置获取ListCreateAPIView和其他列表视图 . 最初我使用SerializerMethodField处理子实例的序列化,其类似于:
class ParentSerializer(serializers.ModelSerializer):
child = serializers.SerializerMethodField('get_child')
(other fields)
def get_child(self, obj):
if obj.content_type == "child_a":
return ChildASerializer(obj.child).data
...
现在我想充分利用Django Rest Framework(包括反序列化/创建/验证),所以我想通过以下方式避免我当前的方法并增加DRYness:
class ParentSerializer(serializers.ModelSerializer):
(code for serializing parent fields except 'child' attribute)
class ChildASerializer(serializers.ModelSerializer):
(code for ChildA fields)
class ParentTypeASerializer(ParentSerializer):
child = ChildASerializer()
如果我正在阅读文档,这意味着POST / PUT将通过序列化程序的过程,而不必在视图和其他丑陋中覆盖post方法 . 这很重要,因为ChildA,ChildB,ChildC来自插件,核心Parent / ParentSerializer应该尽可能不知道它们 .
我的想法是在视图中覆盖 get_serializer()
,但是当列出许多对象时,我看不出如何在视图中提供ParentTypeASerializer,ParentTypeBSerializer等 .
def get_serializer(self, instance=None, data=None, files=None, many=False, partial=True):
serializer_class = None
if instance and instance.content_type == "child_a":
serializer_class = ParentTypeASerializer
if instance and instance.content_type == "child_b":
serializer_class = ParentTypeBSerializer
...
# What about many=True ?!
return serializer_class(instance,data=data,files=files,many-many,partial=partial,context=context)
我的另一个想法是编写一个扩展WritableField的PolymorphicField类来做出决定 . 不确定这是否是最简单的方法:
class ParentSerializer(serializers.ModelSerializer):
child = PolymorphicChildSerializerProxy() # Passes through/wraps the right serializer
问题:是否有任何动态/运行时/每对象方式为视图级别或父序列化程序以这种方式为Generic /多态嵌套对象提供正确的序列化程序?理想情况下,第二个示例和视图中的覆盖适用于List / Create / Destroy泛型或类似第一个示例,除了我返回序列化程序类而不是序列化数据?