如果有 2 个外键使用 Django Rest Framework 连接同一个表,如何序列化连接表?

我有一个简短的模型来存储足球队及其比赛结果。Match 模型有一个 home_team_id 和away_team_id 来标识 2 支球队,它们都是 Team 模型的外键。我想序列化这两个表中的数据以获得以下输出:


[

 {

        "home_team_id": 283584,

        "home_team_name": "FC Bayern München"

        "away_team_id": 61,

        "away_team_name": "Chelsea FC"

        "match_id": 12342

        "home_team_goals": 1,

        "away_team_goals": 2,

  },

  ...

]

models.py


from django.db import models


class Team(models.Model): 

    team_id = models.IntegerField(primary_key=True)

    team_name = models.CharField(max_length=200, blank=False, null=False)

    #category_id = models.IntegerField(blank=False)

    #value = models.IntegerField(blank=False)


    def __str__(self):

        return '%s' % (self.team_name)


class Match(models.Model):

    match_id = models.IntegerField(primary_key=True)

    home_team_id = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="home_team_id")

    away_team_id = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="away_team_id")

    home_team_goals = models.SmallIntegerField(blank=False)

    away_team_goals = models.SmallIntegerField(blank=False)

views.py


@api_view(['GET'])

def full_list(request):

    full = Match.objects.all()

    serializer = TeamMatchesSerializer(full, many=True)

    return Response(serializer.data)

serializers.py


class TeamMatchesSerializer(serializers.ModelSerializer):

    team_name = serializers.StringRelatedField(many=True, read_only=True)

    class Meta:

        model = Match

        fields = ('match_id',  'home_team_goals', 'away_team_goals', 'team_name')

我收到一个错误:“Match”对象没有属性“team_name”,这与在views.py中一样公平,匹配模型已被选择,但是我在序列化器。我根据此处的教程尝试了另一种方法,在序列化器中使用团队模型: https: //www.django-rest-framework.org/api-guide/relations/,但它不起作用。我什至不知道如何区分团队名称,因为它都使用团队模型。


这个查询的原始 SQL 只是为了确保我的问题有意义:


select home.team_id,

       home.team_name,

       away.team_id,

       away.team_name,

       a.match_id,

       a.home_team_goals,

       a.away_team_goals

from api_match a



慕标琳琳
浏览 180回答 1
1回答

偶然的你

解决方案很简单,只要您想要在序列化器中得到一些计算值,您就可以使用serializers.SerializerMethodField() docs。在您的情况下,您可以将序列化器定义为class TeamMatchesSerializer(serializers.ModelSerializer):    home_team_name = serializers.SerializerMethodField()    away_team_name = serializers.SerializerMethodField()        def get_home_team_name(self, obj):        return obj.home_team_id.team_name            def get_away_team_name(self, obj):        return obj.away_team_id.team_name              class Meta:        model = Match        fields = '__all__' 另外,我的建议是,在声明外键字段的属性名称时,不要_id在末尾使用后缀,因为 ORM 会为您完成此操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python