使用Django REST Framework从主键反序列化相关对象

时间:2013-10-22 20:10:53

标签: django-rest-framework

Django REST框架的新手。序列化进展顺利。我不清楚的是如何从数据库中仅给出其主键的相关对象的反序列化。这就是我的意思:

class ThingA(models.model):
    name = models.CharField(max_length=25)
    role = models.CharField(max_length=25, null=True, blank=True)

class ThingB(models.model):
    name = models.CharField(max_length=25)
    athing = models.ForeignKey(ThingA)

假设我有一个POST /thingb REST调用来创建新的ThingB,并且有效负载包含新ThingB的名称和id的相关ThingA 1}}(已存在于数据库中):

{
    "name": "Name for new ThingB",
    "athing" : 5
}

如何编写DRF序列化程序,该序列化程序也可以反序列化此有效负载,最终得到ThingB athing属性为id为5的ThingA对象?我一直在尝试使用DRF ModelSerializers,所以我已经做到了这一点:

class ThingASerializer(serializers.ModelSerializer):

    class Meta:
        model = ThingA
        fields = ('id', 'name', 'role')

class ThingBSerializer(serializers.ModelSerializer):
    a_thingie = ThingASerializer(source='athing')

    class Meta:
        model = ThingB
        fields = ('id', 'name', 'a_thingie')

文档的反序列化示例使用了属性为简单类型的对象的简单情况,而JSON有效内容包含了所需的所有内容。当结果对象包含另一个对象的外键时反序列化的最佳实践是什么?我知道我不能这样做:

# THIS WON'T WORK
b = ThingBSerializer(data=request.DATA)

我认为我可以通过覆盖序列化程序类中的restore_object方法取得一些进展,但我发现永远不会调用restore_object。谁能指点我或提供这个操作的例子?谢谢!

1 个答案:

答案 0 :(得分:5)

签出PrimaryKeyRelatedField它应该完全符合您的需要 - 至少在设置与提交的有效负载的关系方面。

如果要返回a_thingie的完整表示,可以继承PrimaryKeyRelatedField并覆盖to_native来执行此操作,而不是仅返回密钥。

我希望有所帮助。