如何在django中删除queryset中的前N项

ugmeyewa  于 2023-10-21  发布在  Go
关注(0)|答案(4)|浏览(191)

我希望只删除django中查询返回的前N个结果。遵循我在阅读this SO answer时发现的django示例,我能够使用以下代码限制结果集

m = Model.objects.all()[:N]

但尝试删除它会产生以下错误

m.delete()
AssertionError: Cannot use 'limit' or 'offset' with delete.

在django中有没有办法做到这一点?

kupeojn6

kupeojn61#

您不能删除超过限制。大多数数据库不支持此功能。
你可以通过两个步骤来完成,比如:

Model.objects.filter(id__in=list(Models.objects.values_list('pk', flat=True)[:N])).delete()

因此,我们首先检索第一个N元素的主键,然后在.filter(..)部分中使用它来批量删除这些项。

bz4sfanl

bz4sfanl2#

你没有直接的选择权。所以你应该用一些先进的方法来删除它。举例来说:

not_ideal = Model.objects.all()[N:].values_list("id", flat=True)
Model.objects.exclude(pk__in=list(not_ideal)).delete()

使用这种方式,你可以找到你不理想的对象,并删除除了它们的一切。你可以使用id以外的任何东西。但是id是唯一的,可以帮助你优化。
请注意,在第一行中,我获取的是从Nlast的项。(而不是从firstN

xmq68pz9

xmq68pz93#

试试这个。遍历所有过滤过的对象

delatable_objects = Model.objects.all()[:N]
for m in delatable_objects:
    m.delete()
jk9hmnmh

jk9hmnmh4#

您可以循环查询集并对对象应用delete方法。

for obj in m:
    obj.delete()

相关问题