【问题标题】:Django 1.6: Clear data in one tableDjango 1.6:清除一张表中的数据
【发布时间】:2014-08-17 07:46:15
【问题描述】:

我有一个表名 UGC,想清除该表中的所有数据。我不想重置整个应用程序,这也会删除所有其他模型中的所有数据。是否可以只清除一个模型?如果有帮助,我还为我的应用程序配置了 South。

【问题讨论】:

    标签: python database django models


    【解决方案1】:

    你可以use raw SQL

     cursor.execute(“DROP TABLE UGC”)
    

    或者你可以直接在 Django shell 中使用 ORM:

    UGCModel.objects.all().delete()
    

    这会删除数据(但不是表格),所以你必须小心:)

    另一种方法(为了完整性和利用 South)是在模型声明中注释掉模型,迁移然后再放回去(假设没有模型引用它。)

    HTH

    【讨论】:

      【解决方案2】:

      在管理界面中,您可以转到该模型的列表页面,然后您可以选择所有模型并使用表格顶部的Delete selected ... 操作。

      请记住,无论您以何种方式删除数据,外键默认为ON DELETE CASCADE,因此任何具有您要删除的模型的外键的模型也将被删除。管理界面将为您提供将被删除的模型的完整概述。

      【讨论】:

      • 很高兴指出级联的事情,但要小心管理员删除的操作:如果您有很多(我的意思是很多)对象,这将花费相当长的时间并不必要地消耗资源。
      • @Ambroise 为什么会这样?删除日志真的会占用资源吗?
      • 我曾尝试以这种方式删除 80k 个对象:行为是遍历所有项目并为每个项目调用 model_instance.delete(),而模型管理器的方法 Model.objects.delete()是批量删除(一次全部删除)。一旦达到一千个对象,我建议不要使用此方法,否则它是一种可行且方便的方法。
      • @Ambroise 从 Django 1.1 开始,删除操作在查询集上调用 delete() 方法。但是,它确实会遍历查询集并记录每个单独模型实例的删除。与单独删除每个对象相比,此迭代消耗的资源几乎没有,但我可以看到如果查询集那么大,它可能会给您的系统带来多大压力。
      • 嗯,我误解了等待时间(以及偶尔的低规格服务器,关机),我的错 :) 谢谢你的解释!
      【解决方案3】:

      今天在使用 django 2.0.2 时遇到了此类问题,因为我创建了我的模型

      class Front(models.Model):
          pass
      

      并迁移了它,但是当我后来更新模型时,我无法运行 python manage.py makemigrations 因为它在说

      You are trying to add a non-nullable field 'update' to front without a default; we can't do that (the database needs something to populate existing rows).
      Please select a fix:
       1) Provide a one-off default now (will be set on all existing rows 
      with a null value for this column)
       2) Quit, and let me add a default in models.py
      Select an option:
      

      我的解决方案是什么?

      1. 我选择了选项 2,即退出
      2. 我注释掉了麻烦的模型/表,在我的例子中是 Front
      3. 我运行python manage.py makemigrations 删除了麻烦的表/模型
      4. 我取消注释我的模型并再次运行 python manage.py makemigrations,它重新创建了表/模型,最后
      5. 我使用 python manage.py migrate 迁移了我的更改,一切都已解决!

      注意:请注意上述指令,因为它会删除表/模型的所有引用/外键 on_delete=models.CASCADE 这是默认值!

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-08
        • 2014-08-11
        • 1970-01-01
        相关资源
        最近更新 更多