Как удалить все данные из таблицы с помощью 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.