创建具有深度选项支持的相同类型的嵌套序列化程序



假设模型中存在子关系和父关系,例如:

class Foo(models.Model):
parent = models.ForeignKey('Foo', related_name='children')

现在我想有一个序列化程序来显示Foo对象的子对象,如下所示:

class FooSerializer(serializers.ModelSerializer):
children = FooSerializer(many=True)
class Meta:
model = Foo
fields = '__all__'

但这给了我错误,它在创建该类时无法识别FooSerializer,而该类在python解析类的方式方面是正确的。我怎样才能实现这种关系并有一个序列化程序来获取它的子级。 我必须提到,我希望能够使用嵌套序列化程序depth选项。

我正在使用 django 2.2.7 和 rest 框架 3.10.1。

编辑

可能有一些嵌套级别必须使用depth选项停止,在某些级别之后必须将其展平,因此我希望能够沿嵌套序列化程序使用depth选项。

depth属性用于外键关系,在您的情况下,它是反向FK关系,因此不起作用


您可以通过在嵌套配置中使用多个序列化程序来实现类似depth的功能。

示例 1:结果类似于depth=1

class FooBaseSerializerLevel1(serializers.ModelSerializer):
class Meta:
model = Foo
fields = '__all__'

class FooBaseSerializerLevel0(serializers.ModelSerializer):
children = FooBaseSerializerLevel1(many=True)
class Meta:
model = Foo
fields = '__all__'

示例 2:结果类似于depth=2

class FooBaseSerializerLevel2(serializers.ModelSerializer):
class Meta:
model = Foo
fields = '__all__'

class FooBaseSerializerLevel1(serializers.ModelSerializer):
children = FooBaseSerializerLevel2(many=True)
class Meta:
model = Foo
fields = '__all__'

class FooBaseSerializerLevel0(serializers.ModelSerializer):
children = FooBaseSerializerLevel1(many=True)
class Meta:
model = Foo
fields = '__all__'

关键点是,不要定义要停止嵌套效果的children

基于另一个答案,我写了一个支持深度选项的版本:

class FooSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
def get_children(self, obj):
if obj.children:
depth = getattr(self.Meta, 'depth', None)
if not depth:
depth = self.context.get('depth', 0)
if depth:
return SessionSerializer(obj.children.all(),
many=True,
context={'depth': depth - 1}).data
else:
return [child.id for child in obj.children.all()]
else:
return []

它也支持深度选项。

最新更新