모델 속성을 사용하는 ModelSerializer


99

직렬화하려는 속성 필드가 포함 된 모델을 직렬화하려고합니다.

models.py :

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

serializers.py :

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

관련 URL을 가져 오려고 할 때 ext_link속성 에서 serializer 예외 (KeyError)가 발생 합니다.

ext_link속성을 직렬화하려면 어떻게 해야합니까?

답변:


138

모델 필드가 아니기 때문에 serializer 클래스에 명시 적으로 추가해야합니다.

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

5
참고 사항 : Meta의 필드 목록은 선택 사항입니다. 생략fields하면 위의 예에서 직렬화 된 데이터의모든MyModel필드와 함께가져옵니다ext_link. 그리고 이것은 복잡한 모델에 정말 대단합니다! 편집 : 적어도 이것은 사실입니다djangorestframework==2.3.14.
e.thompsy

나를 위해 serializers.Field를 사용하면 오류가 발생했습니다. "serializers.ReadOnlyField"는 to_representation이 정의되지 않고보기가 읽기 전용 인 경우 작동합니다.
Shashank Singla 2015-08-14

15
3.3.x를 사용하고 있으며 필드에 속성을 추가하는 것만으로는 충분하지 않습니다. 여전히 ext_link = serializers.ReadOnlyField ()를 통해 명시 적으로 추가해야합니다.
jarmod

4
Python 3.5.1 및 Django 1.10에서 DRF 3.4.6을 사용하여 필드에 추가하면 잘 작동합니다.
Vaibhav Mishra

9
참고 :를 사용 하여 버전 3.7.7을 사용하여 지정된 jarmod fields = "__all__"로 추가해야했습니다.myfield = serializers.ReadOnlyField()
Robert Townley

22

@Robert Townley의 코멘트, 버전이 작품 3.8.2:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

    class Meta:
        model = MyModel
        fields = "__all__"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.