如果我有一个嵌套的序列化程序:
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')
我想访问嵌套序列化程序中的上下文,我该怎么做?据我所知,上下文没有传递给孩子。
我希望能够在字段上为每个用户实现一个权限模型,为此我重写了 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() 时,上下文以及请求和用户不可用。嵌套序列化程序时如何访问上下文?
原文由 Robin van Leeuwen 发布,翻译遵循 CC BY-SA 4.0 许可协议
好的,我找到了一个可行的解决方案。我用添加上下文的 SerializerMethodField 替换了 Parent 类中的 ChildSerializer 赋值。然后将其传递到我的 CustomModelSerializer 中的 get_fields 方法:
在我的 CustomModelSerializer 中:
这似乎工作正常,当我撤销对 _Child.cname 或 Parent.child 的读取权限时,子项的字段在序列化程序中被丢弃