Подтвердить что ты не робот

Как изменить имя поля в 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'

Как я могу это сделать?

4b9b3361

Ответ 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')