Как изменить имя поля в Django REST Framework
Я пытаюсь изменить имя поля модели в сериализаторе DRF, как псевдоним в SQL. Я пробовал разные методы, но не смог добиться успеха.
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, но не могу изменить.
обновленный
Это исключение, с которым я сталкиваюсь
AttributeError в /ViewName/объект 'module' не имеет атрибута 'Field'
Как я могу это сделать?
Ответы
Ответ 1
Вы можете использовать serializers.SerializerMethodField
:
Вот модель парка, которая имеет поля name и alternate_name.
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
Вот Сериализатор для Парковой Модели, ParkSerializer. Это меняет имя alternate_name на location.
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=...)
и другие типы полей.
Однако это будет работать только для полей только для чтения.
Ответ 2
В полях сериализатора и сериализаторах есть очень хорошая функция, называемая "источником", где вы можете указать источник данных из поля модели.
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
Это работает также с созданием, удалением и изменением типа запросов. Он эффективно создает однозначное сопоставление имени поля в сериализаторе и имени поля в моделях.
Ответ 3
Это будет работать и для операций записи
class ParkSerializer(serializers.ModelSerializer):
location = serializers.CharField(source='alternate_name')
class Meta:
model = Park
fields = ('id', 'name', 'location')