【问题标题】:Django REST - Resolving Foreign Keys and M2M's in a SerializerDjango REST - 在序列化程序中解析外键和 M2M
【发布时间】:2014-04-18 09:25:33
【问题描述】:

我有以下型号:

class Player(models.Model):
    name = models.CharField(max_length=30)

class Achievement(models.Model):
    name = models.CharField(max_length=30)

class UnlockedAchievement(models.Model):
    achievement = models.ForeignKey(Achievement)
    date = models.DateTimeField()    

class PlayerAchievements(models.Model):
    player = models.ForeignKey(Player)
    unlocked_achievements = models.ManyToManyField(UnlockedAchievement, related_name="unlocked_achievements", blank=True, null=True)

通过 PUT,我试图解析玩家的外键以及所有成就的嵌套关系。我的 JSON 数据实际上如下所示:

{"name":"playername",
    "achievements":
    {
        "ach1":"timestamp",
        "ach2":"timestamp",
    }
}

我想不通的是使用哪种序列化器的神奇组合,以及在使用它们时,使用哪些序列化器字段或嵌套序列化器能够通过 name 解析播放器,以及解锁的成就(然后是他们的成就外键)。

在这种情况下,我无法访问身份证号码,因此为什么事情是按名称完成的。

这似乎是一种奇怪的混合物。任何人都可以伸出援助之手吗?提前致谢!

【问题讨论】:

    标签: json django rest serialization


    【解决方案1】:

    您可以使用nested relationships 完全包含相关模型的序列化:

    class AchievementSerializer(serializers.ModelSerializer):
        class Meta:
            model = Achievement
    
    class UnlockedAchievementSerializer(serializers.ModelSerializer):
        achievement = AchievementSerializer(many=False)
    
        class Meta:
            model = UnlockedAchievement
    
    class PlayerAchievementsSerializer(serializers.ModelSerializer):
        unlocked_achievements = UnlockedAchievementSerializer(many=True)
    
        class Meta:
            model = PlayerAchievements
    
    class PlayerSerializer(serializers.ModelSerializer):
        player_achievements = PlayerAchievementsSerializer(many=False)
    
        class Meta:
            model = Player
    

    然后只需按名称过滤Player 对象并对其进行序列化。

    【讨论】:

    • 我基本了解这一切是如何运作的,谢谢您的澄清。但是,我同样对使用这些嵌套关系实现 PUT/POST 的正确视图的外观感到困惑。你也可以帮忙吗?我最近(大约一年前)发现的许多文章都提到这是非常 WIP 的。我不确定使用更新版本的 Django 是否会变得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2021-04-08
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多