2017-08-28 5 views
0

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', 
    ], 
} 

私が適応しようとしていますAlbumSerializersto_representationto_internal_valueのメソッドがありましたが、シリアライザが書き込み可能でなければならないという要件で動作するようにはなりませんでした。私は何が欠けていますか?

答えて

1

あなたはserializermethodfield

tracks = serializers.SerializerMethodField() 

def get_tracks(self, obj): 
    return obj.tracks.values_list('title', flat=True) 

def create(self, validated_data): 
    data = self.context['request'].data.copy() 
    tracks_data = data.get('tracks', []) 
    album = Album.objects.create(**validated_data) 
    for track_data in tracks_data: 
     Track.objects.create(album=album, **track_data) 
    return album 
+0

を試すことができますが、それは右、読み取り専用ですか? – peterthomassen

+0

はい、あなたが書いたければ 'create'メソッドをオーバーライドできます。 –

+0

'create'メソッドでは、' validated_data'しかありません。これには読み込み専用フィールドが含まれていません。他のアイデアはありますか? – peterthomassen

関連する問題