如果我有一个嵌套的序列化程序:
class ChildSerializer(ModelSerializer):
class Meta:
fields = ('c_name', )
model = Child
class ParentSerializer(ModelSerializer):
child = ChildSerializer(many=True, read_only=True)
class Meta:
model = Parent
fields = ('p_name', 'child')
我想访问嵌套序列化程序中的上下文,我该怎么做?据我所知,上下文没有传递给 child 。
我希望能够在字段上实现每个用户的权限模型,为此我覆盖了 ModelSerializer 的 get_fields() 方法:
def get_fields(self):
fields = super().get_fields()
....
for f in fields:
if has_rights(self.context['request'].user, f, "read"):
ret_val[f] = fields[f]
....
return ret_val
这适用于常规序列化程序,但是当嵌套子项传递给 get_fields() 时,上下文以及请求和用户不可用。嵌套序列化程序时如何访问上下文?
最佳答案
好的,我找到了一个可行的解决方案。我用添加上下文的 SerializerMethodField 替换了 Parent 类中的 ChildSerializer 分配。然后将其传递给我的 CustomModelSerializer 中的 get_fields 方法:
class ChildSerializer(CustomModelSerializer):
class Meta:
fields = ('c_name', )
model = Child
class ParentSerializer(CustomModelSerializer):
child = serializers.SerializerMethodField('get_child_serializer')
class Meta:
model = Parent
fields = ('p_name', 'child')
def get_child_serializer(self, obj):
serializer_context = {'request': self.context.get('request') }
children = Child.objects.all().filter(parent=obj)
serializer = ChildSerializer(children, many=True, context=serializer_context)
return serializer.data
在我的 CustomModelSerializer 中:
class CustomModelSerializer(rest_serializer_classes.HyperlinkedModelSerializer):
def __init__(self, *args, **kwargs):
"""
Make sure a user is coupled to the serializer (needed for permissions)
"""
super().__init__(*args, **kwargs)
if not self.context:
self._context = getattr(self.Meta, 'context', {})
try:
self.user = self.context['request'].user
except KeyError:
self.user = None
def get_fields(self):
ret = OrderedDict()
if not self.user:
print("No user associated with object")
return ret
fields = super().get_fields()
# Bypass permission if superuser
if self.user.is_superuser:
return fields
for f in fields:
if has_right(self.user, self.Meta.model.__name__.lower(), f, "read"):
ret[f] = fields[f]
return ret
这似乎工作正常,当我撤销 Child.c_name 或 Parent.child 的读取权限时,序列化程序中会丢弃子字段
关于django - 嵌套序列化程序 django rest 框架中的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30560470/