Как получить relate model без вложенности в Django rest framework?

Как получить json с реляционной моделью, но без вложенности в Django rest framework?

Код :

Модели, Session и Athlete, Athlete модели имеют отношения внешнего ключа с Session

class Session(models.Model):
    Id = models.AutoField(primary_key=True)
    SessionNo = models.SmallIntegerField()
    WinTeam = models.SmallIntegerField(null=True)

class Athlete(models.Model):
    Id = models.AutoField(primary_key=True)
    Name = models.CharField(max_length=6)
    Age = models.SmallIntegerField()
    Session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='athletes')
    Status = models.SmallIntegerField()

Serializers

class SessionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Session
        fields = '__all__'

class AthleteSerializer(serializers.ModelSerializer):
    Session = SessionSerializer(read_only=True)

    class Meta:
        model = Athlete
        fields = ('Age', 'Status', 'Session')

И мнения:

def all_athletes(request):
    """
    Get all athletes list
    """
    queryset = Athlete.objects.all().select_related()
    serializer = AthleteSerializer(instance=queryset, many=True)
    return Response(serializer.data)

И результат API :

[
    {
        "Age": 38,
        "Status": 1,
        "Session": {
            "Id": 13,
            "SessionNo": 1,
            "WinTeam": null
        }
    },
    {
        "Age": 26,
        "Status": 1,
        "Session": {
            "Id": 13,
            "SessionNo": 1,
            "WinTeam": null
        }
    },
    {
        "Age": 35,
        "Status": 2,
        "Session": {
            "Id": 13,
            "SessionNo": 1,
            "WinTeam": null
        }
    }
]

Это работает для получения реляционной модели, но я хочу, чтобы реляционные модели показывали без вложенных, как это сделать, чтобы соответствовать моим ожиданиям?

Я ожидаю результат API:

[
    {
        "Age": 38,
        "Status": 1,
        "Id": 13,
        "SessionNo": 1,
        "WinTeam": null
    },
    {
        "Age": 26,
        "Status": 1,
        "Id": 13,
        "SessionNo": 1,
        "WinTeam": null
    },
    {
        "Age": 35,
        "Status": 2,
        "Id": 13,
        "SessionNo": 1,
        "WinTeam": null
    }
]

Вы можете попробовать SerializerMethodFields....

class AthleteSerializer(serializers.ModelSerializer):
    Id = serializers.SerialierMethodField(read_only=True)
    SessionNo = serializers.SerialierMethodField(read_only=True)
    WinTeam = serializers.SerialierMethodField(read_only=True)

    class Meta:
        model = Athlete
        fields = ('Age', 'Status', 'Id', 'SessionNo', 'WinTeam')
    
    def get_Id(self, obj):
        return obj.Session.id
    
    def get_SessionNo(self, obj):
        return obj.Session.SessionNo
    
    def get_WinTeam(self, obj):
        return obj.Session.WinTeam

А затем не забудьте предварительно получить сеансовые отношения (отношения) в наборе запросов вашего представления, иначе оно будет обращаться к базе данных несколько раз для этих нескольких полей

Вы можете переопределить to_representation() также.

def to_representation(self, value):
   ref = super().to_representation(value)
   session = ref.pop("Session")
   ref.update(**session)
   return ref
Вернуться на верх