我们从Python开源项目中,提取了以下1个代码示例,用于说明如何使用rest_framework.serializers.ReadOnlyField()。
def serializer_factory(endpoint=None, fields=None, base_class=None, model=None): if model is not None: assert endpoint is None, "You cannot specify both a model and an endpoint" from .endpoints import Endpoint endpoint = Endpoint(model=model) else: assert endpoint is not None, "You have to specify either a model or an endpoint" if base_class is None: base_class = endpoint.base_serializer meta_attrs = { 'model': endpoint.model, 'fields': fields if fields is not None else endpoint.get_fields_for_serializer() } meta_parents = (object, ) if hasattr(base_class, 'Meta'): meta_parents = (base_class.Meta, ) + meta_parents Meta = type('Meta', meta_parents, meta_attrs) cls_name = '{}Serializer'.format(endpoint.model.__name__) cls_attrs = { 'Meta': Meta, } for meta_field in meta_attrs['fields']: if meta_field not in base_class._declared_fields: try: model_field = endpoint.model._meta.get_field(meta_field) if isinstance(model_field, OneToOneRel): cls_attrs[meta_field] = serializers.PrimaryKeyRelatedField(read_only=True) elif isinstance(model_field, ManyToOneRel): cls_attrs[meta_field] = serializers.PrimaryKeyRelatedField(many=True, read_only=True) except FieldDoesNotExist: cls_attrs[meta_field] = serializers.ReadOnlyField() return type(cls_name, (NullToDefaultMixin, base_class, ), cls_attrs)