在DJANGO REST中显示外键

时间:2017-12-22 22:26:15

标签: python django rest django-rest-framework

我的第一个问题。很高兴成为这个社区的一员。 我的问题:我正在使用python3和django rest框架来创建API。 我有以下型号:

class Game(models.Model):
    # id = models.AutoField(primary_key=True)
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    url = models.CharField(max_length=100)
    created_at = models.BigIntegerField()
    updated_at = models.BigIntegerField()
    summary = models.CharField(max_length=2000)
    first_release_date = models.BigIntegerField()
    category = models.SmallIntegerField()
    cover = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class ReleaseDate(models.Model):
    id = models.AutoField(primary_key=True)
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    created_at = models.BigIntegerField()
    updated_at = models.BigIntegerField()
    category = models.SmallIntegerField()
    platform = models.SmallIntegerField()
    date = models.BigIntegerField()
    region = models.SmallIntegerField()
    y = models.SmallIntegerField()
    m = models.SmallIntegerField()
    human = models.CharField(max_length=10)

要为Game和ReleaseDate创建一个序列化器,我会这样做:

class ReleaseDateSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReleaseDate
        fields = '__all__'


class GameSerializer(serializers.ModelSerializer):

    class Meta:
        model = Game
        fields = '__all__'

......这将为我提供:

[
    {
        "name": "God of war",
        "url": "efgsd"
    },
    {
        "name": "Uncharted",
        "url": "sgdfd"
    },
    {
        "name": "Fortnight",
        "url": "efgsd"
    }
]

我将如何实现这一目标,即:

[
    {
        "name": "God of war",
        "url": "efgsd"
        "release_dates": "[
           {..},
           {..}
         ]"
    },
    {
        "name": "Uncharted",
        "url": "sgdfd"
        "release_dates": "[
           {..},
           {..}
         ]"
    },
    {
        "name": "Fortnight",
        "url": "efgsd"
        "release_dates": "[
           {..},
           {..}
         ]"
    }
]

非常感谢!

1 个答案:

答案 0 :(得分:0)

drf documentation for nested serializers所述,您必须执行类似

的操作

修改game模型中的ReleaseDate FK,以包含related_name属性release_date

class Game(models.Model):
     game = models.ForeignKey(Game, related_name = 'release_date', on_delete = models.CASCADE)

然后更新您的GameSerializer

class GameSerializer(serializers.ModelSerializer):
    release_date = ReleaseDateSerializer(many = True, read_only = True)

    class Meta:
        model = Game
        fields = ('name', 'url', 'release_date', )