Как удалить все данные из таблицы с помощью Django


113

У меня два вопроса:

  1. Как удалить таблицу в Django?
  2. Как удалить все данные в таблице?

Это мой код, который не удался:

Reporter.objects.delete()

Ответы:


139

Внутри менеджера:

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)

3
Кроме того, если вы используете метод delete_everything (), остерегайтесь этой ошибки: code.djangoproject.com/ticket/16426
Дэвид Планелла,

1
Хотя это отвечает на первый вопрос, он не отвечает на второй вопрос. Я бы использовал 'DELETE FROM %s' % (table_name, )для этого бит, оставив таблицу пустой, но неповрежденной.
user3934630 07

94

Согласно последней документации , правильный метод вызова:

Reporter.objects.all().delete()

3
Да, но это убивается, если у вас много записей в таблице. поэтому мне пришлось сделать это так: для x в MyTable.objects.all (). iterator (): x.delete ()
max

2
@max Обратите внимание, что при этом deleteвызывается метод экземпляра , а при deleteвызове метода QuerySet- нет.
alxs

20

Если вы хотите удалить все данные из всех ваших таблиц, вы можете попробовать эту команду python manage.py flush. Это приведет к удалению всех данных в ваших таблицах, но сами таблицы по-прежнему будут существовать.

См. Подробнее здесь: https://docs.djangoproject.com/en/1.8/ref/django-admin/


19
Было бы полезно упомянуть, что он также удаляет вашего суперпользователя
Ауриэль Перлманн,

15
Он сказал «все данные из всех ваших таблиц», что должно указывать на то, что это очень разрушительная операция.
Jordan

6

Используя оболочку,

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()

4

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 () - единственный метод QuerySet, который не отображается в самом диспетчере. Это защитный механизм, предотвращающий случайный запрос Entry.objects.delete () и удаление всех записей. Если вы действительно хотите удалить все объекты, вам необходимо явно запросить полный набор запросов:

Я сам попробовал приведенный ниже фрагмент кода в моем somefilename.py

    # 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


1

Есть несколько способов:

Чтобы удалить его напрямую:

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

Чтобы удалить его из экземпляра:

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

// не используйте одно и то же имя

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.