Python / Django如何在更新数据库时避免更新内存中的queryset对象

时间:2017-06-03 13:15:50

标签: python django django-models django-templates django-views

如果我使用我的观点:

def test(request):
    order = Order.objects.filter(status='new')
    context = {}
    context['order_list'] = order
    return render(request, 'checkout/order.html',context)

上下文变量order_list工作正常,它在模板上呈现, 但在得到queryset objet order之后我想更新数据库,所以我这样做了:

def test(request):
    order = Order.objects.filter(status='new')
    context = {}
    context['order_list'] = order
    Order.objects.filter(id__in=order).update(status='warning') #added this line
    return render(request, 'checkout/order.html',context)

更新在数据库上工作正常,但也更改了我的上下文变量oder_list,它在模板上变为空。 为什么order对象也会更新?我做错了吗?

1 个答案:

答案 0 :(得分:1)

我不认为你本身做错了什么,但这只是Django处理查询集的方式。所以当你这样做时

order = Order.objects.filter(status='new')

查询集仅标记为""用于评估,而当您尝试处理模板中的记录时,会发生实际评估。

这就是你做的时候的原因

Order.objects.filter(id__in=order).update(status='warning')

上下文变量具有反映更新的值。

您似乎正在尝试将状态更新为警告'如果一个对象已被查看 - 是否正确?

如果是这样,你可以采用的一种方法是 - 一旦页面被渲染,你可以发送一个ajax请求来更新id列表的状态。

另一种效率较低的方法是在更新之前评估查询集 - 例如:

context['order_list'] = list(order)