2014-11-20 2 views
2

모델 직렬 변환기에 정적 필드를 포함 할 수 있습니까? 내 모든 위치를 볼 수 있습니다DRF : 시리얼 라이저의 정적/읽기 전용/비 모델 필드?

class LocationSerialiser(serializers.ModelSerializer): 
    class Meta: 
     model = Location 
     fields = ("id", "long", "lat") 

간단한 ListAPIView와 :

class Location(models.Model): 
    long = models.FloatField(...) 
    lat = models.FloatField(...) 

과 시리얼 예를 들어, 나는 모델이

{ 
    'id': 1, 
    'long': ..., 
    'lat': ..., 
}, 
... 

을하지만 난이하고 싶은 말은 내 json 응답의 모든 객체에 정적, 비 모델 필드가 추가 되었습니까? 다음과 같이 입력하십시오 :

{ 
    'id': 1, 
    'long': ..., 
    'lat': ..., 
    'display': True, 
    'icon': 'image/marker.png' 
}, 
... 

어떻게 이것을 시리얼 라이저에 추가 할 수 있습니까? fields 모듈 (2.2.4)을 살펴 봤지만이를 달성 할 명확한 방법은 없습니다. 모든 항목에는 source 속성이 필요합니다.

class Location(models.Model): 
    long = models.FloatField(...) 
    lat = models.FloatField(...) 

    @property 
    def show(self): 
     return True 

    ... 
:

이상적으로 나는 내가 찾은

class LocationSerialiser(serializers.ModelSerializer): 
    display = fields.BooleanField(value=True) 
    icon = fields.CharField(value="image/marker.png") 

    class Meta: 
     model = Location 
     fields = ("id", "long", "lat") 

편집

한 가지 방법을하고자하는 것은 단순히 모델 인스턴스에 추가 @property 포장 방법을 넣어하는 것입니다

그리고 나서 직렬화에서 r :

class LocationSerialiser(serializers.ModelSerializer): 
    display = fields.BooleanField(value=True) 
    icon = fields.CharField(value="image/marker.png") 

    show = fields.CharField(source="show") 

    class Meta: 
     model = Location 
     fields = ("id", "long", "lat") 

하지만 이것은 매우 해킹 된 것 같습니다. 이것을 달성하는 더 깨끗한 방법이 있어야합니까?

답변

3

이 필드가 모델의 속성 또는 메소드 (예 : get_full_name) 인 경우 해당 필드를 가리키는 serializer 필드에 source 사용자 정의를 지정할 수 있습니다. Django REST Framework는 메소드임을 자동으로 감지하여 호출하고 표시합니다.

class Location(models.Model): 
    # ... 

    def display(self): 
     return True 

    def icon(self): 
     return "image/marker.png" 

class LocationSerialiser(serializers.ModelSerializer): 
    display = serializers.BooleanField(read_only=True) 
    icon = serializers.CharField(read_only=True) 

    class Meta: 
     model = Location 
     fields = ("id", "long", "lat", "display", "icon",) 

당신이 또는 모델에 기능을 넣어하지 않을 수없는 경우

, 장고 REST 프레임 워크가 표시됩니다 데이터를 반환 할 수 있습니다 시리얼에 메소드를 호출 a SerializerMethodField 있습니다.

class LocationSerialiser(serializers.ModelSerializer): 
    display = serializers.SerializerMethodField("get_display") 
    icon = serializers.SerializerMethodField("get_icon") 

    class Meta: 
     model = Location 
     fields = ("id", "long", "lat", "display", "icon",) 

    def get_display(self, obj): 
     return True 

    def get_icon(self, obj): 
     return "image/marker.png" 
+0

아, 첫 번째 방법은 알아 냈지만 두 번째 방법은 훨씬 더 의미가 있습니다. 나는 그것을 놓쳤다. [문서에] (http://www.django-rest-framework.org/api-guide/fields#serializermethodfield). –

관련 문제