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
'your programing' 카테고리의 다른 글
FrameLayout 여백이 작동하지 않습니다. (0) | 2020.10.15 |
---|---|
JRE 8에서 JavaFX 사용, "액세스 제한"오류 (0) | 2020.10.15 |
회계 응용 프로그램 달러 금액에 부동 소수점 또는 소수점을 사용합니까? (0) | 2020.10.15 |
C # 가로 세로 비율을 유지하면서 다른 크기로 이미지 크기 조정 (0) | 2020.10.15 |
특정 비트를 바이트 단위로 설정 (0) | 2020.10.15 |