如何将自定义模型字段中的额外属性传递给序列化程序?
例如,我有这个自定义模型字段RsTestField,它有一个额外的属性“info”,它是True或False:
class RsTestField(models.Field): __metaclass__ = models.SubfieldBase def get_internal_type(self): return "CharField" def __init__(self,info=False,*args,**kwargs): self.info = info super(RsTestField,self).__init__(*args,**kwargs) def is_info(self): return self.info
在以下模型中使用哪个,我可以传递此自定义属性的值:
class Client(models.Model): test1 = RsTestField(max_length=255,info=True,default="") name1 = models.CharField(max_length=255,default="")
以下序列化器:
class ClientSerializer(serializers.HyperlinkedModelSerializer): test1 = ModelField(model_field=Client()._meta.get_field('test1')) class Meta: model = Client fields = ('name1','test1')
我希望能够访问test1-info属性,就像我能够访问name1-max_length属性一样.
这可能吗?
目标是最终在Scheme概述中传递此属性,可以使用OPTIONS http请求检索该属性:
"actions": { "POST": { "name1": { "type": "string","required": false,"read_only": false,"label": "Client name 1","max_length": 255 },"test1": { "type": "field","required": true,"label": "Test1" } } }
在“test1”中应该有一个额外的关键:
"info": True
解决方法
问题1:
I want to be able to access the test1-info attribute just like i would
be able to access the name1-max_length attribute.
是的,您可以通过ModelField.model_field.info访问您的info属性.
你可以看到下面的例子.
问题2为您的最终目标:
我认为您可以自定义自己的元数据类.
from rest_framework.metadata import SimpleMetadata from rest_framework.serializers import ModelField from pbweb.models import RsTestField class MyMetadata(SimpleMetadata): def get_field_info(self,field): field_info = super(MyMetadata,self).get_field_info(field) # I will add the info field only for RsTestField-ModelField if isinstance(field,ModelField) and isinstance(field.model_field,RsTestField): # access your info attribute HERE field_info['info'] = field.model_field.info return field_info
并且,不要忘记配置您的DEFAULT_METADATA_CLASS设置
settings.py
REST_FRAMEWORK = { 'DEFAULT_METADATA_CLASS': 'my.customize.MyMetadata' }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。