2017-06-04 43 views
1

2つのシリアライザクラスを互いに参照する必要がありますが、両方のクラスが互いに参照している場合、定義されていないクラスの1つを取得しています。私は、クラス名/差分名の複製を作成しましたが、これはうまくいくようですが、3つのクラスを作成せずにこれを行うより良い方法はありますか?お互いを参照するDjangoシリアライザクラス

class ArtistSerializer(serializers.ModelSerializer): 

    name = serializers.CharField() 
    class Meta: 
     model = Artist 
     fields = ('id', 'name',) 

class TrackSerializer(serializers.ModelSerializer): 

    artist = ArtistSerializer(read_only=True) 
    class Meta: 
     model = Track 
     fields = ('id', 'artist', 'title',) 

class ArtistSerializer2(serializers.ModelSerializer): 

    name = serializers.CharField() 
    tracks = TrackSerializer(many=True, read_only=True) 
    class Meta: 
     model = Artist 
     fields = ('id', 'name', 'slug', 'tracks') 
+0

これは循環参照です。なぜあなたは1つ必要ですか? – e4c5

+0

アーティスト情報のトラックの詳細と関連するすべてのトラックにアーティスト名の参照を表示したいので、 – bayman

+0

私の答えを試しましたか? – e4c5

答えて

2

これは循環クラス依存です。あなたの解決策は、利用可能な回避策の1つです。別のオプションは、StringRelatedField

を使用して、すべて一緒に円形dependecyを回避することであるStringRelatedFieldはユニコード方法を用い 関係のターゲットを表すために使用されてもよいです。

class ArtistSerializer(serializers.ModelSerializer): 
    tracks = TrackSerializer(many=True, read_only=True) 
    name = serializers.CharField() 
    class Meta: 
     model = Artist 
     fields = ('id', 'name', 'slug', 'tracks') 

class TrackSerializer(serializers.ModelSerializer): 

    artist = StringRelatedField() # read only by default. 
    class Meta: 
     model = Track 
     fields = ('id', 'artist', 'title',) 
関連する問題