加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Django REST序列化程序和自定义模型字段的额外属性

发布时间:2020-12-20 13:49:39 所属栏目:Python 来源:网络整理
导读:如何将自定义模型字段中的额外属性传递给序列化程序? 例如,我有这个自定义模型字段RsTestField,它有一个额外的属性“info”,它是True或False: class RsTestField(models.Field): __metaclass__ = models.SubfieldBase def get_internal_type(self): return
如何将自定义模型字段中的额外属性传递给序列化程序?

例如,我有这个自定义模型字段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'
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读