web-dev-qa-db-ja.com

Django REST Frameworkでフィールド名を変更する方法

SQLのエイリアスのようにDRFシリアライザーのモデルフィールド名を変更しようとしています。別の方法を試しましたが、成功しません。

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/'module'オブジェクトのAttributeErrorには属性 'Field'がありません

これどうやってするの?

71
Shoaib Ijaz

_serializers.SerializerMethodField_を使用できます:

モデルはこちらPark。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
_

ここにシリアライザーがあります Park Model、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
_

さらに、source属性で_serializers.CharField_を使用できます。

_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=...)およびその他のフィールド型も実行できます。

ただし、これは読み取り専用フィールドでのみ機能します。

34
erthalion

シリアライザーフィールドと、一般に「ソース」と呼ばれるシリアライザーには非常に素晴らしい機能があり、モデルフィールドからデータのソースを指定できます。

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

これは、リクエストの作成、削除、および変更タイプでも機能します。シリアライザーのフィールド名とモデルのフィールド名の1対1のマッピングを効果的に作成します。

185
iankit

これは書き込み操作でも機能します

class ParkSerializer(serializers.ModelSerializer):
    location = serializers.CharField(source='alternate_name')

    class Meta:
        model = Park
        fields = ('id', 'name', 'location')
12
vijay