DRF ModelSerializer 使所有字段为只读,而无需明确指定它们

nie*_*kas 5 serialization django-models python-3.x django-rest-framework

我能够制作只读模型序列化器,例如:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = ['name', 'ratio']
        read_only_fields = fields
Run Code Online (Sandbox Code Playgroud)

但是,我倾向于频繁添加/删除字段Foo。如果每次Foo修改序列化器时不更新它会容易得多。这fields = '__all__'非常方便:

class FooSerializer(serializers.ModelSerializer):
    class Meta:
        model = Foo
        fields = '__all__'
        read_only_fields = fields
Run Code Online (Sandbox Code Playgroud)

但是,read_only_fields不接受__all__作为有效选项并引发此异常:

Exception Type: TypeError at /api/foo/
Exception Value: The `read_only_fields` option must be a list or tuple. Got str.
Run Code Online (Sandbox Code Playgroud)

如何将所有字段标记为只读而不显式地将每个字段添加到read_only_fields列表中?

小智 5

您可以get_fields像这样扩展方法:

def get_fields(self):
    fields = super().get_fields()
    for field in fields.values():
        field.read_only = True
    return fields
Run Code Online (Sandbox Code Playgroud)