gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:59 25 4
gpt4 key购买 nike

如何将自定义模型字段中的额外属性传递给序列化程序?

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

我希望能够像访问 name1-max_length 属性一样访问 test1-info 属性。

这可能吗?

目标是最终在 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

最佳答案

问题一:

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设置

设置.py

REST_FRAMEWORK = {
'DEFAULT_METADATA_CLASS': 'my.customize.MyMetadata'
}

关于python - Django REST 序列化程序和来自自定义模型字段的额外属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30214551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com