0

동적 데이터 세트가 있습니다. 직렬 포트를 동적으로 생성하여 장고 REST 프레임 워크와 함께 사용하려고하지만 추가 한 동적 속성을 처리하지 않는 것 같습니다. I 코드를 실행할 때동적 직렬 프로그램을 사용하는 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"}]

다음은 쉘에서 만든 후 클래스의 출력 : 또한, 내가 해봤

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

내가 잘못하고있는 무슨 확실하지 않다가.

답변

0

여기에서는 필드 만 동적이며 기본 serializer는 같습니다. 그것이 작동되도록하기 위해서, 우리는 serializers.py에서

에 필드 만 변경됩니다 당신은 할 것이다 다음 get_serializer_class 방법 이상 당신 것 return DynamicSerializer(dyn_fields=dyn_fields)

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.py을 info visit http://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields

+0

__init__ 메쏘드의 서명을 변경해야했습니다 : def __init __ (self, dyn_fields = None, * args, ** kwargs). 이제 'DynamicSerializer'객체를 호출 할 수없는 오류가 발생합니다. – bah

+0

'get_serializer_class'를 덮어 쓰지 않아도되므로이 문제가 발생합니다. 여기를보세요 https://github.com/encode/django-rest-framework/blob/master/rest_framework/generics.py#L105-L130 'get_serializer_class'는 인스턴스가 아닌 클래스 (호출 가능)를 반환 할 것으로 예상합니다. . 'get_serializer()'를 오버라이드해야한다. – foobarna

+0

도와 주셔서 감사합니다. 올바른 방향으로 나를 안내해 주셔서 감사합니다. 이 경우 문제의 원인이되므로 위치 인수를 사용할 수 없습니다. 여기를 참조하십시오 [link] (https://github.com/encode/django-rest-framework/issues/4397) – bah