Django Rest Framework,如何从名称列表中添加序列化器字段

时间:2018-10-23 09:32:08

标签: python django-rest-framework

我有一个Django Rest Framework序列化程序,其中包含许多浮点字段,例如

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) )

我无法找到上面的“内容”或“ some_function”。

是否可以这样做? python中有没有一种方法可以向类添加属性并从变量中获取名称? 还是在Django Rest Framework中对此有特定的支持?

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

(字段列表本质上是固定的,对其进行更改具有系统范围的含义。它有时可能会更改,但在程序运行时肯定不会更改)

2 个答案:

答案 0 :(得分:1)

尝试覆盖如下的序列化器的 __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)})

答案 1 :(得分:0)

我认为“通常”以下代码可以完成将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))

但是serializers.Serializer具有一个元类,该类包括对类主体中存在的任何“字段”属性的特殊处理。 for循环添加的FloatFields在元类完成工作后添加,因此无法正确处理。

元类删除它找到的所有“字段”属性,并将它们移到_declared_fields字典中。

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

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)