如何将额外的属性从自定义模型字段传递给序列化器?
例如,我有这个自定义模型字段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,
"read_only": false,
"label": "Test1"
}
}
}
在“ test1”中,应该有一个额外的键:
"info": True
问题1:
我希望能够访问test1-info属性,就像我将能够访问name1-max_length属性一样。
是的,您可以通过访问info
属性ModelField.model_field.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'
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句