python - return 语句后如何更新模型
问题描述
我有一个视图应该在渲染到模板后将模型数据更新为“已发送”。我想排除已发送的内容,然后更新已发送的值 no(数字),然后将数据返回到模板。
问题是,如果我按原样使用它,它似乎一次完成了所有三个 liunes 并且在发送时排除了 no,我如何在返回数据后更新它作为发送。
def get(self, request, *args, **kwargs):
lab = request.GET.get('lab', None)
audit = models.SendAudit.objects.filter(no__exact=labno).exclude(status__contains='sent')
models.SendAudit.objects.select_related().filter(no__exact=labno).update(status='{Sent}')
return render(request, self.template_name2, {'audit': audit, 'no': no})
解决方案
QuerySet
s 是惰性的,这意味着只要您不迭代查询,或者以其他方式调用len(…)
或使用查询集,它就不会运行查询。
您可以使用list(…)
将其具体QuerySet
化为列表,例如:
def get(self, request, *args, **kwargs):
lab = request.GET.get('lab')
qs = models.SendAudit.objects.filter(no=labno)
audit = list(qs.exclude(status__contains='sent'))
qs.update(status='{Sent}')
return render(request, self.template_name2, {'audit': audit, 'no': no})
然而,在 GET 请求中进行更新没有多大意义。根据 HTTP 标准,GET 请求不应该有副作用。POST/PATCH/PUT/… 请求可能有副作用。
推荐阅读
- html - 当页脚出现在移动设备上时,将页脚移到键盘上方
- python - 在开发中使用烧瓶和在生产中使用 nginx 提供静态文件
- c# - 如何在 linq 查询中使用反射?RSS
- vhdl - Extra variable assignment in VHDL code makes it not work and get error "can't infer register" and "couldn't implement registers"
- deep-learning - 实施问题:用于模式识别的 Deep ConvNet
- reactjs - 返回 React 组件的 Promise 的 Typescript 类型声明
- python - 为什么将 youtube api 与 oauth 一起使用时出现授权错误
- statistics - 如果 RMSE 的值远远超过 1,这意味着什么?
- python - 导入时从同一文件夹获取文件(不硬编码路径)
- firebase - 在 null.Flutter 上调用了 getter 'uid'