在嵌套的序列化程序字段中访问序列化程序实例

时间:2015-08-13 16:26:39

标签: python django django-rest-framework

嵌套序列化程序中的字段内部是否存在访问父序列化程序实例的方法。特别是在列表视图中访问的实例,尤其是最顶层序列化程序可能具有多个实例的情况。我想将此作为上下文传递,但上下文由视图传递。

当在字段的to_representation中,例如,在列表中,我可以访问列表视图中父项的实例列表,但我不确定哪一个是当前正在处理的实例。

1 个答案:

答案 0 :(得分:9)

这个问题有点过于宽泛,所以我会给出一个通用答案。

DRF中的任何字段(包括序列化程序,因为它们从字段中继承)可以通过self.parent访问父序列化程序。此外,您还可以通过self.root访问根序列化程序本身(在视图中实例化的序列化程序)。

但是,根据我的问题收集的内容,您正在尝试在执行to_representation的过程中从父序列化程序访问某些状态。这样做很滑,因为在DRF中,序列化和验证都是无状态过程。换句话说,只有根序列化程序可以具有状态(在self上存储状态),但这不应该发生在子序列化程序中。如果需要访问状态,最好的方法是在序列化器之间显式传递状态。例如:

class ChildSerializer(Serializer):
    def to_representation(self, instance):
        foo = instance.foo  # comes from parent serializer
        ...

class RootSerializer(Serializer):
    child = ChildSerializer()
    def to_representation(self, instance):
        instance.foo = 'foo'  # parent is setting state
        ...

您还提到您正在使用列表。这将涉及ListSerializer,所以如果你需要在那里传递状态,那么创建一个自定义ListSerializer

class RootListSerializer(ListSerializer):
    def to_representation(self, instance):
        for i in instance:
            i.foo = 'foo'
        ...

class RootSerializer(Serializer):
    class Meta(object):
        list_serializer_class = RootListSerializer