如何在Django中为关联字段正确设置Session实例
正确设置Subscription的session属性
报错原因是你给form.instance.session赋值的是Session模型的类对象(request.session.model),而字段要求的是一个Session实例。
要获取当前请求对应的Session实例,你需要通过request.session.session_key拿到当前会话的key,再从Session模型中查询对应的实例:
首先导入Session模型:
from django.contrib.sessions.models import Session
然后修改视图中的赋值代码:
@login_required @require_POST def subscr_view(request): form = SubscriptionForm(request.POST) if form.is_valid(): # 获取当前请求的Session实例 session_instance = Session.objects.get(session_key=request.session.session_key) form.instance.session = session_instance form.instance.user = request.user subscr = form.save() return JsonResponse({'subscription': subscr.id}, status=201) return JsonResponse({'errors': list(form.errors.keys())})
另外,如果你担心Session实例不存在的情况(虽然@login_required已经确保用户有有效会话),可以用get_object_or_404替代get,返回404错误:
from django.shortcuts import get_object_or_404 # ... session_instance = get_object_or_404(Session, session_key=request.session.session_key)
这样就能正确将当前会话的实例赋值给Subscription的session字段,解决报错问题。
内容的提问来源于stack exchange,提问作者Ezon Zhao
相关产品推荐
相关产品推荐

