[django] Django REST Framework에서 필드 이름을 변경하는 방법

SQL의 별칭과 같은 DRF Serializer의 모델 필드 이름을 변경하려고합니다. 나는 다른 방법을 시도했지만 성공할 수 없습니다.

models.py

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

    def alias_alternate_name(self):
        return self.alternate_name

serializers.py

class ParkSerializer(serializers.ModelSerializer):

    location = serializers.Field(source='alias_alternate_name')
    #location = serializers.SerializerMethodField(source='alias_alternate_name')

    #alternate_name as location


    class Meta:
        model = Park
        fields = ('id', 'name', 'location')

또한 Django Queryset에 별칭을 추가하려고 시도했지만 변경할 수 없습니다.

업데이트 됨

이것은 내가 직면 한 예외입니다.

/ ViewName / ‘모듈’개체의 AttributeError에 ‘필드’속성이 없습니다.

어떻게 할 수 있습니까?



답변

다음을 사용할 수 있습니다 serializers.SerializerMethodField.

다음은 이름 및 alternate_name 필드 가있는 모델 Park입니다.

class Park(models.Model):
    name = models.CharField(max_length=256)
    alternate_name = models.CharField(max_length=256, blank=True)
    objects = models.GeoManager()

    class Meta:
        db_table = u'p_park'

    def __unicode__(self):
        return '%s' % self.name

다음은 Park Model 용 Serializer , ParkSerializer입니다. 그러면 alternate_name의 이름이 위치로 변경됩니다.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SerializerMethodField('get_alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

    def get_alternate_name(self, obj):
        return obj.alternate_name

또한 다음 속성 serializers.CharField과 함께 사용할 수 있습니다 source.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='other_fields')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

__외래 키를 탐색하는 Django의 표기법도 작동합니다.

location = serializers.CharField(source='OtherModel__other_fields')

API에서 반환 유형을 변경하려는 경우에도 동일한 원칙이 적용되므로 serializers.DecimalField(source=...)다른 필드 유형도 수행 할 수 있습니다.

그러나 이것은 읽기 전용 필드에서만 작동합니다.


답변

serializer 필드와 serializer에는 일반적으로 ‘source’라는 매우 멋진 기능이 있습니다. 여기서 모델 필드의 데이터 소스를 지정할 수 있습니다.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.SomeSerializerField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('other_fields', 'location')

여기서 serializers.SomeSerializerField는 모델이 제안한대로 serializers.CharField가 될 수 있지만 다른 필드에서도 가능합니다. 또한 관계형 필드 및 기타 직렬 변환기를 대신 넣을 수 있으며 여전히 매력처럼 작동합니다. 즉, alternate_name이 다른 모델에 대한 외래 키 필드 인 경우에도 마찬가지입니다.

class ParkSerializer(serializers.ModelSerializer):
    locations = AlternateNameSerializer(source='alternate_name', many=true)

    class Meta:
        model = Park
        fields = ('other_fields', 'locations')

class AlternateNameSerializer(serializers.ModelSerialzer):
    class Meta:
        model = SomeModel

이것은 요청의 생성, 삭제 및 수정 유형에도 적용됩니다. 직렬화 기의 필드 이름과 모델의 필드 이름의 일대일 매핑을 효과적으로 생성합니다.


답변

이것은 쓰기 작업에서도 작동합니다.

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('id', 'name', 'location')


답변