0

我有一个动态数据集,我试图通过动态创建序列化程序与 Django REST 框架一起使用,但它似乎没有处理我添加的动态属性。

这是代码:

-- views.py
class DynamicReadings(generics.ListAPIView):
    def get_serializer_class(self):
        site = self.kwargs['site']
        devices = Device.objects.filter(reader__site__slug=site).order_by('code')
        dyn_fields = ['x%s' % a.code for a in devices]
        return SerializerClassFactory(dyn_fields)

    def get_queryset(self):
        ...
        # the query is correct and returns data

-- serializers.py
def SerializerClassFactory(dyn_fields):
class DynamicSerializer(serializers.Serializer):
    read_at = serializers.DateTimeField()

    class Meta:
        fields = ('read_at')

    for f in dyn_fields:
        setattr(DynamicSerializer, f, serializers.FloatField())
    DynamicSerializer.Meta.fields += ','.join("'%s'" % f for f in dyn_fields)

    return DynamicSerializer

当我执行代码时,只有类定义中指定的属性(read_at)被序列化。动态属性似乎都没有工作。

例子:

[{"read_at":"2017-05-07T00:12:29Z"},{"read_at":"2017-05-08T00:12:30Z"}]

这是在 shell 中创建后的类的输出:

>>> serializer = SerializerClassFactory(['x01', 'x02', 'x03'])
>>> serializer.__dict__
mappingproxy({'__module__': 'xxx.api.serializers', 
'Meta': <class 'xxx.api.serializers.SerializerClassFactory.<locals>.DynamicSerializer.Meta'>, 
'x02': FloatField(), '_declared_fields': OrderedDict([('read_at', DateTimeField())]), 
'__doc__': None, 'x01': FloatField(), 'x03': FloatField()})

此外,我尝试过:

setattr(DynamicSerializer, f, property(serializers.FloatField()))
setattr(DynamicSerializer, f, type(serializers.FloatField()))

我不确定我做错了什么。

4

1 回答 1

0

在这里,只有字段是动态的,基本序列化器是相同的。为了使其正常工作,我们将仅更改DynamicSerializer

serializers.py你会有:

class DynamicSerializer(serializers.Serializer):
    read_at = serializers.DateTimeField()

    class Meta:
        fields = ('read_at')

    def __init__(*args, dyn_fields=None, **kwargs):
        dyn_fields = dyn_fields or []
        for field in dyn_fields:
            self.fields[field] = serializers.FloatField()

        super(DynamicSerializer, self).__init__(*args, **kwargs)

并且在你想要views.pyget_serializer_class方法中return DynamicSerializer(dyn_fields=dyn_fields)

欲了解更多信息,请访问http://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields

于 2017-05-10T20:34:22.280 回答