“切片拍摄后无法更新查询”。最佳做法?

时间:2016-02-04 16:33:59

标签: python django

由于我的项目的性质,我发现自己经常从查询集中取出切片,如下所示:

Thread.objects.filter(board=requested_board_id).order_by('-updatedate')[:10]

但是这给我留下了实际使用我选择的元素的东西的问题,因为任何类型的.update()或.filter()在切片后都不起作用。

我知道有几种方法可以解决这个问题,但它们都是混乱和混乱的,并严重降低了代码的可读性,特别是当我不得不经常这样做时。

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

1 个答案:

答案 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)