【问题标题】:How to serialize models with multiple foreign keys?如何序列化具有多个外键的模型?
【发布时间】:2019-07-24 08:01:06
【问题描述】:

我想以下面给出的格式序列化数据。我是 django-rest 框架的新手。我在一个大学项目中工作。所以,我们将不胜感激。

    {
      {
      "Series_name":"something",
      "Home_team":"anything",
      "Away_team":"sbh",
       "players":[
                {
                   "id":"1",
                    ...
                }
                {
                    "id":"2",
                    ...
                }
        ]

      },

      {
      "Series_name":"something2",
      "Home_team":"anything",
      "Away_team":"sbh",
       "players":[
                {
                   "id":"1",
                    ...
                }
                {
                    "id":"1",
                    ...
                }
        ]

       }

    }

我试过这个。但这并没有给出令人满意的结果。实际上它返回空集。

    class PlayersSerializer2(serializers.ModelSerializer):

        class Meta:
            model = Players
            fields = ['name', 'country', 'image', 'role', 'credit']

    class SeriesListSerializer2(serializers.ModelSerializer):

        class Meta:
            model = SeriesList
            fields = '__all__'


    class SeriesSquadsSerializer(serializers.ModelSerializer):
        players = PlayersSerializer2(many=True, read_only=True)
        series = SeriesListSerializer2(many=True, read_only=True)

        class Meta:
            model = SeriesSquads
            fields = ['series', 'players']

这些是我正在使用的模型。我有 3 个模型 SeriesList、Series_Squads 和 Players。Series_sqauds 有唯一的对(Series_name、Players)。它有两个外键指向 SeriesList 和 Players 对象。

    class SeriesList(models.Model):
        Series_name = models.CharField(max_length=250, 
                   unique=True,primary_key=True)
        No_of_matches = models.IntegerField()
        Home_team = models.CharField(max_length=250)
        Away_team = models.CharField(max_length=250)


    class SeriesSquads(models.Model):
        Series_name = models.ForeignKey(SeriesList, on_delete=models.CASCADE)
        Squad_player = models.ForeignKey(Players, on_delete=models.CASCADE)

    class Players(models.Model):
        name = models.CharField(default="", max_length=250)
        country = models.CharField(max_length=250)
        image = models.CharField(max_length=500)
        role = models.CharField(max_length=30)
        credit = models.FloatField(default=None)

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    您可以让SerializerMethodField 的用户将您的 ForeignKey 相关对象放入您的序列化程序中。更新您的序列化程序,以便:

    class PlayersSerializer2(serializers.ModelSerializer):
    
        class Meta:
            model = Players
            fields = ['name', 'country', 'image', 'role', 'credit']
    
    
    class SeriesSquadsSerializer(serializers.ModelSerializer):
        players = PlayersSerializer2(many=True, read_only=True)
        Series_name = serializers.SerializerMethodField()
        Home_team = serializers.SerializerMethodField()
        Away_team =  = serializers.SerializerMethodField()
    
        class Meta:
            model = SeriesSquads
            fields = ['players']
    
        def get_Series_name(self, obj):
            return obj.Series_name.Series_name
    
        def get_Home_team(self, obj):
            return obj.Series_name.Home_team
    
        def get_Away_team(self, obj):
            return obj.Series_name.Away_team
    

    【讨论】:

    • 'Players' 对象不可迭代..我收到此错误..您能帮我解决这个问题吗?
    • 当您在模型中将球员定义为外键时,您的系列小队对象中不能有多个。因此,您需要从序列化程序中删除 many=True
    • 实际上我想获得一个系列列表中的所有玩家。但是如果我删除 many=True ,它只会给所有小队玩家对象。你能告诉我如何让所有玩家都进入一个系列列表吗?
    • 我想说的是,您的序列化程序中必须只有一个玩家对象,因为在您的模型中; players 定义为 ForeignKey。如果你有用户多对多关系,你的序列化器中会有很多玩家。
    • 感谢您的帮助..它有效..因为我是 django 的新手,一开始我不明白..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2019-02-07
    • 2012-03-16
    • 2011-04-30
    • 2020-12-23
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多