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'がありません
これどうやってするの?
_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=...)
およびその他のフィールド型も実行できます。
ただし、これは読み取り専用フィールドでのみ機能します。
シリアライザーフィールドと、一般に「ソース」と呼ばれるシリアライザーには非常に素晴らしい機能があり、モデルフィールドからデータのソースを指定できます。
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のマッピングを効果的に作成します。
これは書き込み操作でも機能します
class ParkSerializer(serializers.ModelSerializer):
location = serializers.CharField(source='alternate_name')
class Meta:
model = Park
fields = ('id', 'name', 'location')