首页 > 解决方案 > 如何在没有嵌套在 Django REST 框架中的情况下获取关联模型?

问题描述

如何获得一个json带有关联模型但没有嵌套在 Django 休息框架中的模型?

代码 :

ModelsSessionAthlete, Athletemodels 有外键关系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()

序列化器

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
    }
]

标签: pythondjangodjango-rest-framework

解决方案


你可以试试 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

然后记住在视图的查询集中预取会话关系,否则它将针对这些多个字段多次访问数据库


推荐阅读