xpa*_*nta 21 django django-queryset
我想这样做:
UserLog.objects.filter(user=user).filter(action='message').filter(timestamp__lt=now)[0:5].update(read=True)
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
Cannot update a query once a slice has been taken.
Run Code Online (Sandbox Code Playgroud)
(使用django 1.2.1)
我究竟做错了什么?
Jon*_*nan 53
该文档建议是像下面这样也许有可能-我不知道如果这样做的限制内QuerySet
绕过围绕需要检查update()
切片后:
inner_q = UserLog.objects.filter(user=user,
action='message',
timestamp__lt=now).values('pk')[0:5]
UserLog.objects.filter(pk__in=inner_q).update(read=True)
Run Code Online (Sandbox Code Playgroud)
如果做不到这一点,您可以使用in
字段查找,如下所示:
ids = UserLog.objects.filter(user=user,
action='message',
timestamp__lt=now).values_list('pk', flat=True)[0:5]
UserLog.objects.filter(pk__in=list(ids)).update(read=True)
Run Code Online (Sandbox Code Playgroud)
Dan*_*per 21
如错误所述,update()
如果您取出切片,则无法调用QuerySet.
原因:
LIMIT
SQL中的语句.UPDATE
语句.你要做的就是等同于
UPDATE ... WHERE ... LIMIT 5
这是不可能的,至少不是标准的SQL.
从 Django 2.2 开始,您可以使用批量更新:
queryset = UserLog.objects.filter(user=user).filter(action='message').filter(timestamp__lt=now)
bulk = []
for userlog in queryset[0:5]:
userlog.read = True
bulk.append(userlog)
UserLog.objects.bulk_update(bulk,['read'])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15795 次 |
最近记录: |