Pet*_*erS 4 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)
Run Code Online (Sandbox Code Playgroud)
假设我有一个POST /thingbREST调用来创建一个新的ThingB,并且有效负载包含新的名称ThingB和id相关的名称ThingA(已存在于数据库中):
{
"name": "Name for new ThingB",
"athing" : 5
}
Run Code Online (Sandbox Code Playgroud)
如何编写DRF序列化程序,也可以反序列化此有效负载,最终得到ThingB的athing属性是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')
Run Code Online (Sandbox Code Playgroud)
文档的反序列化示例使用了属性为简单类型的对象的简单情况,JSON有效负载包含了所需的一切.当结果对象包含另一个对象的外键时反序列化的最佳实践是什么?我知道我不能这样做:
# THIS WON'T WORK
b = ThingBSerializer(data=request.DATA)
Run Code Online (Sandbox Code Playgroud)
我以为我可以通过覆盖restore_object我的序列化程序类中的方法来取得一些进展,但我发现restore_object永远不会被调用.谁能指点我或提供这个操作的例子?谢谢!
查看PrimaryKeyRelatedField它应该完全按照您的需要进行操作 - 至少在设置提交的有效负载的关系方面.
如果你想返回完整的表示,a_thingie你可以继承PrimaryKeyRelatedField并覆盖to_native它来做,而不是只返回密钥.
我希望有所帮助.
| 归档时间: |
|
| 查看次数: |
3070 次 |
| 最近记录: |