Django REST序列化程序和自定义模型字段中的其他属性

罗宾·范·吕文

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

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

问题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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django Rest Framework序列化程序中自定义字段

Django Rest Framework序列化程序中的聚合(和其他带注释的)字段

Django Rest Framework 序列化自定义字段

Django REST Framework - 自定义序列化程序覆盖模型约束

如何在 Django REST 框架中的自定义序列化程序字段中访问请求对象?

序列化中的嵌套字段在Django REST框架中使用自定义字段

从序列化程序自定义字段上的Django Rest Order?

DJANGO:如何编写自定义序列化器,以从相关模型中添加字段?

使用 Django Rest Framework 在序列化程序中自定义响应

Django Rest Framework序列化程序中的自定义错误消息

嵌套序列化程序中的Django Rest Framework自定义URL

Django REST-rest_auth自定义字段未序列化

模型字段(在django中)和序列化器字段(在django rest框架中)之间的区别

序列化Django Rest框架时的其他字段

Django REST-从自定义to_internal_value中运行字段验证以进行序列化

如何在 Django 中使用序列化程序返回自定义的非模型值?

django-rest-auth:自定义注册序列化器不保存自定义字段

如何自定义Django REST序列化程序的默认设置

一个如何自定义Django Rest Framework序列化程序输出?

Django REST-完整用户名的自定义序列化程序

自定义来自Django Rest Framework序列化程序的状态代码响应

如何将自定义参数传递给 Django 自定义相关字段序列化程序

Django,在自定义json中插入两个序列化的对象模型

Django REST Framework 3中的其他序列化器字段

将变量(非模型字段)传递给 django rest 框架中的序列化程序

嵌套关系序列化程序中的Django Rest Framework模型ID字段

Django Rest Framework-在序列化程序中获取相关模型字段

Django Rest Framework-在序列化程序中获取相关模型字段

从Django Rest框架中的序列化器发送自定义错误响应?