1. ホーム
  2. django

[解決済み] Django REST フレームワークでフィールド名を変更する方法

2022-08-14 14:15:42

質問

DRF Serializer のモデルフィールド名を、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

シリアライザー.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' object has no attribute 'Field'.

どうすればいいのでしょうか?

どのように解決するのですか?

この場合 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

以下はシリアライザです。 という公園モデル用のシリアライザです。これは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=...) などのフィールド型も同様です。

しかし、これは読み取り専用のフィールドに対してのみ機能するでしょう。