4

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 /thingbREST 调用来创建一个新的ThingB,并且有效负载包含新的名称ThingB及其id相关的名称ThingA(数据库中已经存在):

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

我如何编写一个 DRF 序列化器,它也可以反序列化这个有效负载,最终得到一个ThingBathing属性是ThingAid=5 的对象?我一直在尝试使用 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永远不会被调用。谁能指出我或提供此操作的示例?谢谢!

4

1 回答 1

5

查看PrimaryKeyRelatedField它应该完全满足您的需求——至少在设置来自提交的有效负载的关系方面。

如果你想返回完整的表示,a_thingie你可以继承 PrimaryKeyRelatedField 并重写to_native来做到这一点,而不是只返回键。

我希望这会有所帮助。

于 2013-10-23T13:33:46.807 回答