gpt4 book ai didi

django - 如何为 DRF Serializer 访问/创建正确的 Request 对象?

转载 作者:行者123 更新时间:2023-12-03 23:17:59 27 4
gpt4 key购买 nike

我已经使用 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序列化器的对象,因为触发它们的模型更新可以来自任何来源。因此,即使尝试创建一个也是没有意义的。我想我必须分离“基本”序列化程序(没有任何超链接)并使用它们向客户端发送更新。由于超链接永远不会改变,我认为这是正确的方法。

最佳答案

如果有人可能感兴趣,这是我解决问题的方法。代码的主要部分如下。

首先是一个简单的模型(myapp/models.py):

from django.db import models

class MyModel(models.Model):
name = models.TextField()

然后是序列化程序(myapp/serializers.py):
from rest_framework import serializers

MyModelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyModel
fields = ('url', 'id', 'name')
extra_kwargs = {'url': {'view_name': 'mymodel-detail'}}

MyModelBaseSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('id', 'name')

和意见(myapp/views.py):
from rest_framework import viewsets
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer

class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer

最后是 Channels 消息消费者 (myapp/consumers.py):
import json
from django.db.models.signals import pre_save
from django.dispatch import receiver
from channels import Group
from myapp.models import MyModel
from myapp.serializers import MyModelBaseSerializer

def ws_add(message):
message.reply_channel.send({"accept": True})
Group("mymodel").add(message.reply_channel)

def ws_disconnect(message):
Group("mymodel").discard(message.reply_channel)

@receiver(post_save, sender=MyModel)
def mymodel_handler(sender, instance, **kwargs):
Group("mymodel").send({
"text": json.dumps({
"model": "mymodel",
"data": MyModelBaseSerializer(instance).data
})
})

我省略了 urls.py 和 routing.py 之类的内容,但这些与问题无关。可以看出,正则 View 使用的是普通的 MyModelSerializer其中包括 URL,然后是更新处理程序 MyModelBaseSerializer只有不依赖于任何 Request 的字段目的。

关于django - 如何为 DRF Serializer 访问/创建正确的 Request 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45783970/

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