Django Rest框架,如何从名称列表中添加序列化程序字段

2024-09-29 23:29:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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框架中对此有具体的支持吗?你知道吗

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

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


Tags: django框架restfalsetrue列表requiredclass
2条回答

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

然而序列化程序。序列化程序有一个元类,其中包含对类主体中存在的任何“字段”属性的特殊处理。for循环添加的floatfield是在元类完成其工作之后添加的,因此无法正确处理。你知道吗

元类删除它找到的所有“Field”属性,并将它们移到一个\u声明的\u fields 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)

尝试重写序列化程序的__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)})

相关问题 更多 >

    热门问题