我有一组嵌套序列化器,其中有一个depth
设置在各自的Meta
类。我想根据视图中传递的参数以编程方式更改深度。
class ResourceSerializer(serializers.ModelSerializer):
type = serializers.PrimaryKeyRelatedField(queryset=EntityType.objects.all())
tags = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), many=True)
class Meta:
model = Resource
fields = ('id', 'type', 'uri', 'tags', 'created_date')
depth = 1
不幸的是,似乎没有办法覆盖depth
运行时的属性。我当前的解决方案是继承“浅”序列化器并覆盖它们的 Meta 类来调整深度。
class ResourceNestedSerializer(ResourceSerializer):
class Meta(ResourceSerializer.Meta):
depth = 2
在我看来:
if nested:
serializer = ContainerNestedSerializer(containers, many=True)
else:
serializer = ContainerSerializer(containers, many=True)
return Response(serializer.data)
有什么办法可以调整吗depth
打电话之前serializer.data
?
这是我的代码,其中包含包含/排除字段以及动态调整深度。根据你的口味调整它。 :)
class DynamicModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed, and takes in a "nested"
argument to return nested serializers
"""
def __init__(self, *args, **kwargs):
fields = kwargs.pop("fields", None)
exclude = kwargs.pop("exclude", None)
nest = kwargs.pop("nest", None)
if nest is not None:
if nest == True:
self.Meta.depth = 1
super(DynamicModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
if exclude is not None:
for field_name in exclude:
self.fields.pop(field_name)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)