Як видалити всі дані з таблиці за допомогою Django


Відповіді:


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, )для цього шматочок, залишивши стіл порожнім, але недоторканим.
користувач3934630

93

Відповідно до останньої документації , правильним методом для виклику буде:

Reporter.objects.all().delete()

3
Так, але це вбивається, якщо у вас багато записів. тому мені довелося це робити так: для x в MyTable.objects.all (). iterator (): x.delete ()
макс

2
@max Зауважте, що при цьому deleteметод екземпляра викликається, тоді як при deleteвиклику на QuerySetньому немає.
alxs

20

Якщо ви хочете видалити всі дані з усіх своїх таблиць, ви можете спробувати команду python manage.py flush. Це видалить усі дані у ваших таблицях, але самі таблиці все ще існуватимуть.

Детальніше дивіться тут: https://docs.djangoproject.com/en/1.8/ref/django-admin/


19
Було б вам корисно зазначити, що він також видаляє вашого
суперпользователя

15
Він сказав "всі дані з усіх ваших таблиць", що повинно вказувати на те, що це дуже руйнівна операція.
Йорданія

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.