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

267

Я хочу удалить конкретную запись. Такие как

delete from table_name where id = 1;

Как я могу сделать это в django model?

user426795
источник
16
Спасибо, что задали вопрос. Иногда RTFM занимает намного больше времени, чем поиск в Google и SO, о чем свидетельствует количество голосов «за» и количество просмотров
Freedom_Ben
8
Согласился с @Freedom_Ben, но для будущих читателей, которым все равно нравится руководство f *, это то, что вы ищете: docs.djangoproject.com/en/dev/topics/db/queries/…
Dinei

Ответы:

513

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

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

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

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

instance = SomeModel.objects.get(id=id)
instance.delete()
Wolph
источник
50
Обратите внимание, что первый не вызовет метод объекта .delete (), поэтому, если в этом методе есть код очистки, он не будет вызван. Вообще не проблема, но стоит иметь в виду.
Мэтью Шинкель
8
@ Мэтью Шинкель: это правда. Если вы хотите использовать собственный метод удаления, вы должны вместо этого использовать сигнал pre_deleteили post_delete.
Вольф
2
Я не знаю, что происходит после DJango 1.4, но на самом деле он извлекает все PK и затем удаляет их. Так, например, если вы удалите произвольное поле, это может быть намного медленнее, чем аналог SQL ... :(
Vajk Hermecz
1
@VajkHermecz: это правда и ожидаемое поведение из-за сигналов удаления. Система сигналов Django должна отслеживать все изменения в базе данных, потому что что-то может к ней подключиться (как это делает реверсия).
Вольф
3
Вы можете использовать возвращаемое значение, delete()чтобы проверить, что вы удаляете. Он возвращает кортеж с количеством удаленных объектов и словарь с подробной информацией об удаленных типах, например (1, {'yourapp.SomeModel': 1}).
17
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(). Это должны быть «объекты».
Найджел
8

если вы хотите удалить один экземпляр, напишите код

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

если вы хотите удалить весь экземпляр, напишите код

delet= Account.objects.all()
delete.delete()
сифул ислам
источник
7

Если вы хотите удалить один элемент

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

Если вы хотите удалить все элементы в Списке желаний, например

Wishlist.objects.all().delete()
Ахмед Адевале
источник
6

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

VicX
источник