Безопасно ли удалять Django QuerySet, который может быть пустым?
Безопасно ли пытаться удалить QuerySet, который может быть пустым? Другими словами, если я не уверен, существует ли имя "MJ", есть ли функциональная разница между этими двумя подходами? Предпочтительнее ли один из них?
1)
query = m.objects.filter(name="MJ")
if query.exists():
query.get().delete()
m.objects.filter(name="MJ").delete()
Да. .get()
попытается получить одиночный объект, и выдаст ошибку, если таких объектов множество.
Более того, если существует только одна запись, первый вариант сделает три запроса: сначала проверит, существует ли как минимум одна запись, затем получит эту запись, и, наконец, сделает вызов удаления, который также может привести к триггерам удаления.
Во втором случае удаляемый объект получает первичные ключи удаляемых объектов, запускает триггеры удаления и, наконец, удаляет эти объекты. Таким образом, он является более эффективным. Более того, если такой записи не существует, или существует несколько объектов с MJ
как name
, он удалит эти объекты, поэтому он менее подвержен ошибкам и более эффективен.