如何使用多个外键序列化模型?

时间:2019-07-24 08:01:06

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

我想以下面给出的格式序列化数据。我是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)

1 个答案:

答案 0 :(得分:0)

您可以让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
相关问题