Django Rest Frameworkドキュメントには、書き込み可能なネストされたシリアライザの例があります。http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializersを参照してください。dictの代わりに文字列を持つ書き込み可能なネストされたDjangoシリアライザ
外部キーフィールドの他に、関連するフィールドが1つのフィールド(title
)しか持たない場合に興味があります。私はこのようにそれを読むように変更:
models.py
class Album(models.Model):
album_name = models.CharField(max_length=100)
artist = models.CharField(max_length=100)
class Track(models.Model):
album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
title = models.CharField(max_length=100)
class Meta:
unique_together = ('album', 'title')
serializers.py
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('title',)
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
def create(self, validated_data):
tracks_data = validated_data.pop('tracks')
album = Album.objects.create(**validated_data)
for track_data in tracks_data:
Track.objects.create(album=album, **track_data)
return album
は今実行します。
>>> data = {
'album_name': 'The Grey Album',
'artist': 'Danger Mouse',
'tracks': [
{'title': 'Public Service Announcement'},
{'title': 'What More Can I Say'},
{'title': 'Encore'},
],
}
>>> serializer = AlbumSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<Album: Album object>
質問:
私はこのように、代わりにdicts {'title': title}
のリストで、シリアライズされたデータのトラックがトラックタイトル文字列のリストとして構成する必要があります
>>> data = {
'album_name': 'The Grey Album',
'artist': 'Danger Mouse',
'tracks': [
'Public Service Announcement',
'What More Can I Say',
'Encore',
],
}
私が適応しようとしていますAlbumSerializers
のto_representation
とto_internal_value
のメソッドがありましたが、シリアライザが書き込み可能でなければならないという要件で動作するようにはなりませんでした。私は何が欠けていますか?
を試すことができますが、それは右、読み取り専用ですか? – peterthomassen
はい、あなたが書いたければ 'create'メソッドをオーバーライドできます。 –
'create'メソッドでは、' validated_data'しかありません。これには読み込み専用フィールドが含まれていません。他のアイデアはありますか? – peterthomassen