我想获得嵌套结果,其中两个模型不是直接相关的,而是通过表间接相关的。
下面只是复制我所处的情况,而不是我正在使用的实际代码。
class ArtistSerializer(serializers.ModelSerializer):
class Meta:
model = Artist
fields = ['name', 'age']
class TrackSerializer(serializers.ModelSerializer):
artist = ArtistSerializer(read_only=True)
class Meta:
model = Track
fields = ['order', 'title', 'duration', 'artist']
class ConcertSerializer(serializers.ModelSerializer):
artist = ArtistSerializer(read_only=True)
tracks = TrackSerializer(many=True, read_only=True)
class Meta:
model = Concert
fields = ['concert_name', 'artist', 'tracks']
Artist
和Track
相关。另外,Artist
和Concert
相关。但是我想使用tracks
来获得TrackSerializer
,以便在与演唱者没有直接关系的情况下获得与同一位艺术家的曲目。这可能吗?一场音乐会将有多首曲目。
您有多种实现方法,考虑到您每场音乐会只有一位艺术家,您可以尝试使用SerializerMethodField
:
class NestedTrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ['order', 'title', 'duration',]
class ConcertSerializer(serializers.ModelSerializer):
artist = ArtistSerializer(read_only=True)
tracks = serializer.SerializerMethodField()
def get_tracks(self, instance):
return NestedTrackSerializer(instance.artist.tracks.all(), many=True).data
class Meta:
model = Concert
fields = ['concert_name', 'artist', 'tracks']