如何以优雅的方式更新切片集?

时间:2014-07-29 08:54:05

标签: django set slice

首先,我想要前250名用户,并更新他们的top = 1

users = MyTable.objects.order_by('-month_length')[0: 250]
for u in users:
    u.top = 1
    u.save()

但是,实际上,我希望有一种优雅的方式,就像这样:

MyTable.objects.all().update(top=1)

此外,从这个问题:Django: Cannot update a query once a slice has been taken

这是否意味着无法写UPDATE ... WHERE ... LIMIT 5

2 个答案:

答案 0 :(得分:0)

你可以试试这个

users = MyTable.objects.order_by('-month_length').values_list("id", flat = True)[0: 250]
MyTable.objects.filter(id__in = list(users)).update(top = 1)

*假设您在MyTable中有一个主键'id'

答案 1 :(得分:0)

在查询集被评估一次之前(此时它将自动缓存),将结果切换为新的查询集。如果已缓存查询集,则使用列表完成切片。至少我最后一次读到关于这个的Django代码,可能是在Django 1.5附近。