如何从Django的queryset中删除前N个项目

Seb*_*eda 3 python django django-rest-framework

我正在寻找只删除Django查询返回的前N个结果。继Django的例子在这里,我发现在阅读本SO答案,我用下面的代码能够限制结果集

m = Model.objects.all()[:N]
Run Code Online (Sandbox Code Playgroud)

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

m.delete()
AssertionError: Cannot use 'limit' or 'offset' with delete.
Run Code Online (Sandbox Code Playgroud)

有没有办法在Django中实现这一目标?

Wil*_*sem 6

您不能通过限制删除。大多数数据库不支持此功能。

但是,您可以分两步完成此操作,例如:

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

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


Ali*_* HI 5

你没有直接的选择。所以你应该通过一些高级的方式删除它。例如:

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

使用这种方式,您可以找到不理想的对象并删除除它们之外的所有内容。你可以在旁边使用任何东西id。但是 id 是唯一的,可以帮助您进行优化。

请注意,在第一行,我让它们从项目Nlast。(不是从firstN