Python &引用;获取切片后无法更新查询";。最佳实践?

Python &引用;获取切片后无法更新查询";。最佳实践?,python,django,Python,Django,由于我的项目的性质,我发现自己不断地从QuerySet中提取片段,如下所示: Thread.objects.filter(board=requested_board_id).order_by('-updatedate')[:10] 但这就给我留下了一个实际使用我选择的元素的问题,因为任何类型的.update()或.filter()在切片后都不起作用 我知道有几种方法可以绕过它,但它们都是混乱和混乱的,并且严重降低了代码的可读性,尤其是当我不得不经常这样做的时候 绕过切片过滤器限制的最佳方法是什

由于我的项目的性质,我发现自己不断地从QuerySet中提取片段,如下所示:

Thread.objects.filter(board=requested_board_id).order_by('-updatedate')[:10]
但这就给我留下了一个实际使用我选择的元素的问题,因为任何类型的.update()或.filter()在切片后都不起作用

我知道有几种方法可以绕过它,但它们都是混乱和混乱的,并且严重降低了代码的可读性,尤其是当我不得不经常这样做的时候


绕过切片过滤器限制的最佳方法是什么?

到目前为止,根据评论,我发现Daniel Roseman的解决方案最不“难看”:

然后使用
id\uu in=
引用切片的queryset对象的id:

Somemodel.objects.filter(id__in=sliced_queryset).update(field_to_update='whatever')
很好用,我刚试过

我希望Django有一个更“直接”的方法来做这件事,但它仍然非常简单。如果有人有更好的方法,请张贴出来,我会把你的答案标记为正确


作为一点额外的建议,如果您使用它来增加一个字段,比如“视图”字段,您可以像这样清晰地自引用它:

from django.db.models import F

Somemodel.objects.filter(id__in=sliced_queryset).update(views=F('views')+1)

这有点宽。你能举一个你想在上面做的操作的例子,也许是你目前的一些我们可以改进的变通方法吗?例如:
Thread.objects.filter(board=requested\u board)[:5]。update(title='whatever')
。如果不使用[:5]切片,这将起作用。当前的解决方法包括使用
itertools.chain
,但这会返回
itertools
对象,然后必须将其转换为列表,甚至作为模板上下文从视图中发送。工作,但它是非常混乱和不可读的。涵盖了这种情况,这也是我的建议。获取过滤和切片查询集的ID(使用
value\u list
或类似工具),并将其重新插入以使用
update
形成新的查询。有点难看,但不是Django的错,正如上面所解释的(
UPDATE…WHERE…LIMIT…
在SQL中不合适)。@Two-bitalchest实际上你可以简化它-你不需要获取id,你可以直接将查询集传递到
过滤器(id\u in=sliced\u queryset)
。不,它将通过子查询来实现:性能仍然很高,但是没有其他的查询那么多。这个黑客很好用
from django.db.models import F

Somemodel.objects.filter(id__in=sliced_queryset).update(views=F('views')+1)