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中实现这一目标?
您不能通过限制删除。大多数数据库不支持此功能。
但是,您可以分两步完成此操作,例如:
Model.objects.filter(id__in=list(Models.objects.values_list('pk', flat=True)[:N])).delete()Run Code Online (Sandbox Code Playgroud)
因此,我们首先检索第一个N元素的主键,然后在.filter(..)一部分中使用它来批量删除那些项。
你没有直接的选择。所以你应该通过一些高级的方式删除它。例如:
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 是唯一的,可以帮助您进行优化。
请注意,在第一行,我让它们从项目N到last。(不是从first到N)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |