Django REST Framework中的一个非常标准的任务是为序列化程序提供额外的 args
/ kwargs
来设置不是通过 request.data
设置的字段值,而是通过url参数或cookie中的值 . 例如,我需要在POST请求时将我的Comment模型的 user
字段设置为 request.user
. 这些额外的参数称为上下文 .
StackOverflow上的几个问题(1,2)建议我覆盖 ModelViewSet
的 get_serializer_context()
方法 . 我做了,它没有错误,并且发现我从源代码中无法理解,这个上下文系统应该如何工作 . (关于此事的文件也遗失了)
谁能解释一下,序列化程序在正常的请求数据中添加了上下文?我找到了两个地方,它从上下文中保存了值 .
-
serializer.save(),方法,它将kwargs与验证数据混合,但通常不带参数调用(例如,通过ModelMixins) .
-
fields.new(),它缓存args和kwargs,但似乎以后没有人读过它们 .
2 回答
无论何时使用通用视图或视图集,DRF(3.3.2)都会将
request
object,view
object和format
添加到序列化程序context
. 您可以使用serializer.context
进行访问,让我们在序列化程序中说request.user
.调用
get_serializer_class()
时会添加此项 . 在其中,它调用get_serializer_context()
方法,其中所有这些参数都添加到其上下文中 .DRF source code for reference:
这就是我在ModelViewSet中处理这两种情况的方法:
不幸的是,嵌套对象不是DRF的标准对象,但除此之外 . :)