2017-06-04 68 views
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

這是一個循環引用。爲什麼你需要一個? – e4c5

+0

因爲我想在歌曲詳細信息中顯示歌手名稱參考以及歌手詳細信息中的所有關聯曲目 – bayman

+0

您是否嘗試過我的答案? – e4c5

回答

2

這是一個循環類依賴。您的解決方案是可用的解決方案之一。另一種選擇是通過使用以避免圓形dependecy所有在一起StringRelatedField

StringRelatedField可以使用利用其的unicode方法來表示 關係的目標。

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',)