Django rest: доступ ко всем связанным объектам с помощью ForeignKey

Я застрял и не знаю, что не так... для меня это идентично примеру "Вложенные отношения" в руководстве DRF API, но что-то не так...

МОДЕЛЬ

class PlayerSquadra(models.Model):
    
    player = models.ForeignKey(
       'app_player.Player',
       on_delete=models.CASCADE,
       verbose_name=_('giocatore'),
       related_name='player_squadraplayer',
    )

    squadra = models.ForeignKey(
        'app_stagione.Squadra',
        on_delete=models.CASCADE,
        verbose_name=_('squadra'),
        related_name='squadra_squadraplayer'
    )

    def __str__(self):
        return '%s' % (self.player)

URL

router.register(r'squadraJSON/(?P<squadra>.*)', views.SquadraViewSet)

Вид

class SquadraViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Squadra.objects.all()
    serializer_class = SquadraSerializer

    def get_queryset(self):
        laSquadra = self.kwargs['squadra']
        queryset = Squadra.objects.filter(id=int(laSquadra))
        return queryset

СЕРИАЛИЗАТОР

class PlayerSquadraSerializer(serializers.ModelSerializer):
    class Meta:
        model = PlayerSquadra
        fields = '__all__'

class SquadraSerializer(serializers.ModelSerializer):
    playersquadra = PlayerSquadraSerializer(many=True, read_only=True)

    class Meta:
        model = Squadra
        fields = ['nomeSquadra','id','playersquadra']

Когда я вызываю http://192.168.0.102:8000/squadraJSON/26/, то получаю следующее:

GET /squadraJSON/26/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "nomeSquadra": "prova2",
        "id": 26
    }
]

И никаких ошибок... В то время как я ожидаю что-то вроде этого:

GET /squadraJSON/26/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "nomeSquadra": "prova2",
        "id": 26
        "playersquadra": [
            {'id': 1, 'firstName': 'Michael', 'lastName': 'Jordan',...},
            {'id': 2, 'firstName': 'Larry', 'lastName': 'Bird',...},
            ...
        ],
    }
]

Подскажите, пожалуйста, почему я не получаю всех игроков, принадлежащих Squadra с id=26? Спасибо за помощь

Вы должны использовать related_name для доступа ко всем связанным PlayerSquadra, что является squadra_squadraplayer, так:

class SquadraSerializer(serializers.ModelSerializer):
    playersquadra = PlayerSquadraSerializer(
        many=True, read_only=True, source='squadra_squadraplayer',
    )

    class Meta:
        model = Squadra
        fields = ['nomeSquadra','id','playersquadra']

или:

class SquadraSerializer(serializers.ModelSerializer):
    # This will change the name of the key to squadra_squadraplayer
    squadra_squadraplayer = PlayerSquadraSerializer(many=True, read_only=True)

    class Meta:
        model = Squadra
        fields = ['nomeSquadra','id','squadra_squadraplayer']

или даже:

class SquadraSerializer(serializers.ModelSerializer):
    playersquadra = serializers.SerializerMethodField()

    class Meta:
        model = Squadra
        fields = ['nomeSquadra','id','playersquadra']
    
    def get_playersquadra(self, obj):
        return PlayerSquadraSerializer(
            obj.squadra_squadraplayer, many=True, read_only=True,
        ).data
Вернуться на верх