【发布时间】:2017-08-20 15:46:28
【问题描述】:
我使用 DRF 创建了一个 REST API,它运行良好。前端是一个简单的页面,允许查看和更新数据。现在我正在尝试使用带有django-channels 的WebSockets 向站点添加更多交互性。 Channels 系统使用起来相当简单,而且运行良好。
但是,我现在面临的问题是尝试将所有移动部件组合在一起以协同工作。我的想法是,初始页面刷新来自 REST API,任何后续更新都会在每次更新后自动通过 WebSocket 进行(借助post_save 信号)。我的所有模型都有很好的 DRF 序列化器,但遗憾的是,如果没有 Request 对象(例如 HyperLinkedIdentityField),它们就无法工作:
AssertionError: `HyperlinkedIdentityField` requires the request in the serializer context. Add `context={'request': request}` when instantiating the serializer.
所以我的问题是,当尝试在信号处理程序中序列化我的模型时,如何以某种方式创建/伪造序列化程序想要的正确请求对象?
编辑
我对此想得越多,就越明显地发现这不是正确的方法。无法为序列化程序制作单个通用的 Request 对象,因为触发它们的模型更新可以来自任何来源。因此,即使尝试创建一个也是没有意义的。我想我必须分离“基本”序列化程序(没有任何超链接)并使用它们向客户端发送更新。由于超链接永远不会改变,我认为这是正确的方法。
【问题讨论】:
-
我不明白“我如何以某种方式创建序列化程序想要的请求对象?”
-
请求对象来自您的视图参数。基本上你可以像这样创建序列化程序实例:
Serializer_class(instance, data=data, context={"request": request}) -
在正常情况下确实有效,但由于这是在信号处理程序 (
@receive(post_save, sender=MyModel)) 内部,因此既没有查看也没有请求使用。
标签: django django-rest-framework django-channels