假设模型中存在子关系和父关系,例如:
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 []
它也支持深度选项。