由于我的项目的性质,我发现自己经常从查询集中取出切片,如下所示:
Thread.objects.filter(board=requested_board_id).order_by('-updatedate')[:10]
但是这给我留下了实际使用我选择的元素的东西的问题,因为任何类型的.update()或.filter()在切片后都不起作用。
我知道有几种方法可以解决这个问题,但它们都是混乱和混乱的,并严重降低了代码的可读性,特别是当我不得不经常这样做时。
解决此切片过滤器限制的最佳方法是什么?
答案 0 :(得分:15)
到目前为止,根据评论,我发现丹尼尔罗斯曼的解决方案是最“丑陋”的:
sliced_queryset = Somemodel.objects.filter(field='fieldvalue')[:5]
然后使用id__in=
引用切片的查询集对象的ID:
Somemodel.objects.filter(id__in=sliced_queryset).update(field_to_update='whatever')
效果很好,我刚尝试过。
我希望Django有更“直接”的方式来做到这一点,但它仍然非常简单。如果有人有更好的方法,请发布,我会将你的答案标记为正确。
作为一些额外的建议,如果你使用它来增加一个字段,比如'views'字段,你可以像这样干净地自我引用:
from django.db.models import F
Somemodel.objects.filter(id__in=sliced_queryset).update(views=F('views')+1)