Як видалити запис у моделях Django?


267

Я хочу видалити певний запис. Як от

delete from table_name where id = 1;

Як я можу це зробити в django model?


16
Дякуємо, що поставили запитання. Іноді RTFM займає набагато більше часу, ніж пошук в Google і так, про що свідчить кількість голосів відповідей і кількість переглядів
Freedom_Ben

8
Погоджено з @Freedom_Ben, але для майбутніх читачів, яким все одно подобається посібник з f *, це те, що ви шукаєте: docs.djangoproject.com/en/dev/topics/db/queries/…
Дінея,

Відповіді:


512

Є кілька способів:

Щоб видалити його безпосередньо:

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

Щоб видалити його з екземпляра:

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

50
Зауважте, що перший не буде викликати метод .delete () об'єкта, тому, якщо у вас є код 'очищення', він не буде викликаний. Як правило, це не проблема, але про це варто пам’ятати.
Меттью Шинкель

8
@Matthew Schinckel: це правда. Якщо ви хочете скористатися користувацьким методом видалення, ви повинні замість цього використовувати сигнал pre_deleteабо post_deleteсигнал.
Вольф

2
Я не знаю, що трапляється після DJango 1.4, але це насправді діставання всіх ПК та видалення цих ПК. Так, наприклад, якщо ви видалите довільне поле, це може бути набагато повільніше, ніж аналог SQL ... :(
Vajk Hermecz

1
@VajkHermecz: це правда і очікувана поведінка через сигнали видалення. Система сигналів Django має відслідковувати всі зміни бази даних, тому що щось може підключитися до неї (як це робить реверсія).
Вольф

3
Ви можете використовувати повернене значення, delete()щоб перевірити, що ви видаляли. Він повертає кортеж із кількістю видалених об'єктів та словник із деталями про видалені типи, наприклад (1, {'yourapp.SomeModel': 1}).
mcb

37
MyModel.objects.get(pk=1).delete()

це призведе до винятку, якщо об’єкт із вказаним первинним ключем не існує, оскільки спочатку він намагається отримати вказаний об'єкт.

MyModel.objects.filter(pk=1).delete()

це не буде винятком, якщо об'єкт із вказаним первинним ключем не існує, і він безпосередньо створює запит

DELETE FROM my_models where id=1

1
Друкувати в MyModel.object.filter(pk=1).delete(). Це повинні бути "об'єкти".
Найджел

7

Якщо ви хочете видалити один елемент

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

Якщо ви хочете, наприклад, видалити всі елементи зі списку бажань

Wishlist.objects.all().delete()

7

якщо ви хочете видалити один екземпляр, тоді напишіть код

delet= Account.objects.get(id= 5)
delet.delete()

якщо ви хочете видалити весь примірник, тоді напишіть код

delet= Account.objects.all()
delete.delete()

6

Вольф дав хороші коди, орієнтовані на відповідь. Дозвольте мені просто вставити офіційний документ тут для ознайомлення з людьми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.