【问题标题】:How to delete first N items from queryset in django如何从 Django 中的查询集中删除前 N 个项目
【发布时间】:2019-07-23 15:10:46
【问题描述】:

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

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

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

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

有没有办法在 django 中实现这一点?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 它不适用于 order_by
    • @ratnesh:你为什么需要.order_by(..)
    【解决方案2】:

    您无法直接选择。因此,您应该通过一些高级方式将其删除。例如:

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

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

    请注意,在第一行中,我得到了从 Nlast 的项目。(不是从 firstN

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以遍历查询集并将删除方法应用于对象。

        for obj in m:
            obj.delete()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-26
          • 1970-01-01
          • 2012-11-26
          • 1970-01-01
          • 2015-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多