gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:06:47 25 4
gpt4 key购买 nike

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 (已经存在于数据库中):

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

我如何编写一个 DRF 序列化器,它也可以反序列化这个有效载荷以结束 ThingB谁的 athing属性是 ThingA id=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永远不会被调用。任何人都可以指出我或提供此操作的示例吗?谢谢!

最佳答案

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

如果您想返回 a_thingie 的完整表示您可以继承 PrimaryKeyRelatedField 并覆盖 to_native这样做,而不是仅仅返回 key 。

我希望这有帮助。

关于django-rest-framework - 使用 Django REST Framework 从主键反序列化相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19527379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com