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