社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

django rest framework,如何从名称列表中添加序列化器字段

Tim Morley • 5 年前 • 1507 次点击  

我有一个django rest框架序列化器,它包含许多浮点字段,例如。

class MySerializer(serializers.Serializer):
    unitID = serializers.CharField(required=True, allow_blank=False, max_length=50)
    timestamp = serializers.DateTimeField(required=True)
    VonDC = serializers.FloatField(required=False)
    VonAC = serializers.FloatField(required=False)
    VoffDC = serializers.FloatField(required=False)
    VonDC2 = serializers.FloatField(required=False)
    etc...

我希望能够从字段名列表中创建这些字段,例如

the_fields = ['VonDC', 'VonAC', 'VoffDC', 'VonDC2', etc...] 

class MySerializer(serializers.Serializer):
    unitID = serializers.CharField(required=True, allow_blank=False, max_length=50)
    timestamp = serializers.DateTimeField(required=True)

    for f in the_fields:
        <something>[f] = serializers.FloatField(required=False)
        or
        <some_function>(<something>, f, serializers.FloatField(required=False) )

我还没找到上面的“某物”或“某物功能”。

有可能这样做吗? python中有没有一种方法可以向类添加属性并从变量中获取名称? 或者在django rest框架中对此有特定的支持吗?

我想这样做的部分原因是因为它更简洁,但主要原因是我已经有了一个字段名列表,我想使用它,而不是重复所有的名称。

(字段列表基本上是固定的,更改它会在系统范围内产生影响。它可能会偶尔更改,但在程序运行时肯定不会更改)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39837
 
1507 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Tim Morley
Reply   •   1 楼
Tim Morley    6 年前

我认为,通常情况下,下面的代码会将floatfields添加为类的属性。

注意for循环在类之后,而不是在其主体中。

the_fields = ['VonDC', 'VonAC', 'VoffDC', 'VonDC2', etc...] 

class MySerializer(serializers.Serializer):
    unitID = serializers.CharField(required=True, allow_blank=False, max_length=50)
    timestamp = serializers.DateTimeField(required=True)

for name in meas_names:
    setattr(MySerializer, name, serializers.FloatField(required=False))

然而serializer.serializer有一个元类,它包含对类主体中存在的任何“field”属性的特殊处理。for循环添加的floatfields是在元类完成其工作后添加的,因此无法正确处理。

元类删除它找到的任何“field”属性,并将它们移到声明的字段dict中。

因此,看起来我们可以通过直接将字段添加到声明的字段来将字段添加到类中。

the_fields = ['VonDC', 'VonAC', 'VoffDC', 'VonDC2', etc...] 

class MySerializer(serializers.Serializer):
    unitID = serializers.CharField(required=True, allow_blank=False, max_length=50)
    timestamp = serializers.DateTimeField(required=True)

for name in meas_names:
    MySerializer._declared_fields[name] = serializers.FloatField(required=False)
JPG
Reply   •   2 楼
JPG    6 年前

尝试覆盖 __init__() 序列化程序的方法如下,

the_fields = ['VonDC', 'VonAC', 'VoffDC', 'VonDC2', ]


class MySerializer(serializers.Serializer):
    unitID = serializers.CharField(required=True, allow_blank=False, max_length=50)
    timestamp = serializers.DateTimeField(required=True)

    def __init__(self, *args, **kwargs):
        super(MySerializer, self).__init__(*args, **kwargs)
        for field in the_fields:
            self.fields.update({field: serializers.FloatField(required=False)})