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




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



спасибо

891   3  

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

    Ничего не найдено.