首页 > 解决方案 > 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})

标签: pythondjangodjango-modelsdjango-views

解决方案


QuerySets 是惰性的,这意味着只要您不迭代查询,或者以其他方式调用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/… 请求可能有副作用。


推荐阅读