Django Вложенное отношение сериализатора, где 2 модели не связаны напрямую? - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу получить вложенные результаты для случаев, когда две модели не связаны напрямую, а косвенно связаны с помощью таблицы.

ниже - просто для воспроизведения ситуации, в которой я нахожусь, а не для фактического кода, который я использую .

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, чтобы получить треки с тем же артистом для концерта, когда они не связаны напрямую. Это возможно? Для концерта будет несколько треков.

1 Ответ

0 голосов
/ 05 февраля 2020

У вас есть несколько способов достичь этого, учитывая, что у вас есть один артист на концерт, вы можете попробовать использовать 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']
...