Как изменить имя поля в 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 at /ViewName/ объект' module 'не имеет атрибута 'Field'
Как я могу это сделать?
спасибо
3 ответов:
можно использовать
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однако это будет работать только для полей только для чтения.
в полях сериализатора и сериализаторах вообще есть очень хорошая функция, называемая "источник", где вы можете указать источник данных из поля модели.
class ParkSerializer(serializers.ModelSerializer): location = serializers.SomeSerializerField(source='alternate_name') class Meta: model = Park fields = ('other_fields', 'location')где сериализаторами.SomeSerializerField может быть сериализаторами.CharField, как предполагает ваша модель, но также может быть любым из других полей. Также вы можете поместить реляционные поля и другие сериализаторы вместо этого, и это все равно будет работать как шарм. т. е. даже если alternate_name было полем foreignkey для другой модели.
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')
Comments