亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果有 2 個外鍵使用 Django Rest Framework 連接同一個表,如何序列化連接表?

如果有 2 個外鍵使用 Django Rest Framework 連接同一個表,如何序列化連接表?

慕標琳琳 2023-08-22 17:10:07
我有一個簡短的模型來存儲足球隊及其比賽結果。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.pyfrom django.db import modelsclass 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.pyclass 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_goalsfrom api_match a
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

解決方案很簡單,只要您想要在序列化器中得到一些計算值,您就可以使用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 會為您完成此操作。


查看完整回答
反對 回復 2023-08-22
  • 1 回答
  • 0 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號