your programing

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

lovepro 2020. 10. 15. 08:18
반응형

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

The same principle applies if you want to change the return type on the API, so you can do serializers.DecimalField(source=...) and other field types as well.

This would however work only for read only fields.


There is a very nice feature in serializer fields and serializers in general called 'source' where you can specify source of data from the model field.

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

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

Where serializers.SomeSerializerField can be serializers.CharField as your model suggests but can also by any of the other fields. Also you can put relational fields and other serializers instead and this would still work like charm. ie even if alternate_name was a foreignkey field to another model.

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

This works with creation, deleting and modification type of requests also. It effectively creates one on one mapping of field name in the serializer and field name in models.


This would work for write operations also

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

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

참고URL : https://stackoverflow.com/questions/22958058/how-to-change-field-name-in-django-rest-framework

반응형