社区所有版块导航
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
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

Tim Morley

Tim Morley 最近回复了
6 年前
回复了 Tim Morley 创建的主题 » django rest framework,如何从名称列表中添加序列化器字段

我认为,通常情况下,下面的代码会将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)