我想在我当前的项目中实现Web推送通知,我希望通知只发送到当前登录的会话(即设备).

因此,我对我的Subscription型号的定义如下:

class Subscription(models.Model):
    device = models.CharField(max_length=100)
    session = models.OneToOneField('sessions.Session', on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    info = models.JSONField()

以及保存订阅的查看功能:

SubscriptionForm = model form_factory(Subscription, fields=['device', 'info'])

@login_required
@require_POST
def subscr_view(request):
    form = SubscriptionForm(request.POST)
    if form.is_valid():
        form.instance.session = request.session.model
        form.instance.user = request.user
        subscr = form.save()
        return JsonResponse({'subscription': subscr.id}, status=201)
    return JsonResponse({'errors': list(form.errors.keys())})

然而,当我保存表单时,Django抱怨Session属性:

ValueError: Cannot assign "<class 'django.contrib.sessions.models.Session'>": "Subscription.session" must be a "Session" instance.

如何正确设置会话属性?

推荐答案

为了让工作代码更清楚,下面是:

from django.contrib.sessions.models import Session
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST

@login_required
@require_POST
def subscr_view(request):
    form = SubscriptionForm(request.POST)
    if form.is_valid():
        session_key = request.session.session_key
        session = get_object_or_404(Session, session_key=session_key)

        form.instance.session = session
        form.instance.user = request.user
        subscr = form.save()
        return JsonResponse({'subscription': subscr.id}, status=201)
    return JsonResponse({'errors': list(form.errors.keys())})

Django相关问答推荐

POST_SAVE接缝有错误

Django-Values()并按月分组

如何在Django中将可选参数传递给视图?

ModuleNotFoundError:没有名为guardian.shortcuts的模块

如何在Django模板中有条件地传递值给with变量?

dj_rest_auth 中的 PyTest 警告- RemovedInDjango40Warning: django.conf.urls.url() 已弃用,取而代之的是 django.urls.re_path()

如何使用具有某些权限的 Django 组的转储数据和加载数据?

lower() 在 None 上被调用

Django:如何在表单 clean() 方法的 django 验证错误中添加 超链接?

无法通过 pip 安装 Django 2.0

ImportError:无法导入设置

将 XML 从 URL 解析为 python 对象

如何使用 select_for_update 在 Django 中获取查询?

jinja2模板引擎中的这个-是做什么的?

Django REST Framework 和 FileField 绝对 url

Django:从视图中添加 non_field_error?

django 管理员操作而不 Select 对象

Django REST Framework - 序列化可选字段

如何使 Django 的开发服务器公开?

在 Django REST 框架序列化程序中动态排除或包含字段