【问题标题】:How to remove all of the data in a table using Django如何使用 Django 删除表中的所有数据
【发布时间】:2011-05-30 18:44:41
【问题描述】:

我有两个问题:

  1. 如何在 Django 中删除表?
  2. 如何删除表格中的所有数据?

这是我的代码,不成功:

Reporter.objects.delete()

【问题讨论】:

标签: python django django-queryset


【解决方案1】:

在经理内部:

def delete_everything(self):
    Reporter.objects.all().delete()

def drop_table(self):
    cursor = connection.cursor()
    table_name = self.model._meta.db_table
    sql = "DROP TABLE %s;" % (table_name, )
    cursor.execute(sql)

【讨论】:

  • 另外,如果你是 delete_everything() 方法,请注意这个错误:code.djangoproject.com/ticket/16426
  • 虽然这回答了第一个问题,但它不处理第二个问题。我会使用'DELETE FROM %s' % (table_name, ) 来表示那个位,让表格空着但完好无损。
【解决方案2】:

根据最新的documentation,正确的调用方法是:

Reporter.objects.all().delete()

【讨论】:

  • 是的,但是如果表中有很多记录,这会被杀死。所以我不得不这样做: for x in MyTable.objects.all().iterator(): x.delete()
  • @max 但是请注意,这样会调用实例的delete 方法,而使用QuerySet 上的delete 调用则不会。
【解决方案3】:

如果您想从所有表中删除所有数据,您可能需要尝试命令python manage.py flush。这将删除表中的所有数据,但表本身仍然存在。

在此处查看更多信息:https://docs.djangoproject.com/en/1.8/ref/django-admin/

【讨论】:

  • 如果您提及它还会删除您的超级用户,对您会有所帮助
  • 他确实说过“所有表中的所有数据”,这应该表明这是一个非常具有破坏性的操作。
  • 用户表与“你的”表在同一个数据库中。在使用这样的操作之前,您现在应该这样做。
  • 作者询问如何删除表中的所有数据,而不是如何刷新所有表中的所有数据。
【解决方案4】:

使用外壳,

1) 删除表:

python manage.py dbshell
>> DROP TABLE {app_name}_{model_name}

2) 从表中删除所有数据:

python manage.py shell
>> from {app_name}.models import {model_name}
>> {model_name}.objects.all().delete()

【讨论】:

  • option 1) 需要一个结束分号>> DROP TABLE {app_name}_{model_name};,也有助于在检查表名之前使用>> .tables
【解决方案5】:

Django 1.11 从数据库表中删除所有对象 -

Entry.objects.all().delete()  ## Entry being Model Name. 

请参阅此处引用的官方 Django 文档 - https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

请注意,delete() 是唯一没有在 Manager 本身上公开的 QuerySet 方法。这是一种安全机制,可防止您意外请求 Entry.objects.delete() 并删除所有条目。如果确实要删除所有对象,则必须显式请求完整的查询集:

我自己在somefilename.py 中尝试了下面看到的代码 sn-p

    # for deleting model objects
    from django.db import connection
    def del_model_4(self):
        with connection.schema_editor() as schema_editor:
            schema_editor.delete_model(model_4)

在我的views.py 中,我有一个简单地呈现 html 页面的视图...

  def data_del_4(request):
      obj = calc_2() ## 
      obj.del_model_4()
      return render(request, 'dc_dash/data_del_4.html') ## 

它结束了从 -model == model_4 中删除所有条目,但是现在当我尝试确定 model_4 的所有对象都已被删除时,我会在管理控制台中看到一个错误屏幕...

ProgrammingError at /admin/dc_dash/model_4/
relation "dc_dash_model_4" does not exist
LINE 1: SELECT COUNT(*) AS "__count" FROM "dc_dash_model_4" 

请考虑 - 如果我们不去 ADMIN 控制台并尝试查看模型的对象 - 已被删除 - Django 应用程序将按预期工作。

django admin screencapture

【讨论】:

    【解决方案6】:

    使用此语法删除行也重定向到主页(以避免页面加载错误):

    def delete_all(self):
      Reporter.objects.all().delete()
      return HttpResponseRedirect('/')
    

    【讨论】:

      【解决方案7】:

      有几种方法:

      直接删除:

      SomeModel.objects.filter(id=id).delete()
      

      从实例中删除它:

      instance1 = SomeModel.objects.get(id=id)
      instance1.delete()
      

      //不要使用相同的名字

      【讨论】:

        【解决方案8】:

        您可以使用 Django-Truncate 库来删除表的所有数据,而不会破坏表结构。

        例子:

        1. 首先,使用终端/命令行安装 django-turncate:
        pip install django-truncate
        
        1. settings.py 文件中将“django_truncate”添加到您的 INSTALLED_APPS:
        INSTALLED_APPS = [
            ...
            'django_truncate',
        ]
        
        1. 在终端中使用此命令从应用程序中删除表的所有数据。
        python manage.py truncate --apps app_name --models table_name
        

        【讨论】:

          【解决方案9】:

          实际上,我从 admin.py 中取消注册模型(我要删除的表数据)。然后我迁移。

          python manage.py makemigrations
          python manage.py migrate
          python runserver
          

          然后我在 admin.py 中注册模型并再次进行迁移。 :) 现在,桌子是空的。这可能不是一个专业的答案,但它帮助了我。

          【讨论】:

            猜你喜欢
            • 2011-03-25
            • 2020-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-24
            相关资源
            最近更新 更多