Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class SomeModel(models.Model):
name = CharField(..., validators=[])
ModelAdmin.delete_model(self, request, obj)
The delete_model method is given the HttpRequest and a model instance. Use this method to do pre- or post-delete operations.
delete — у нас банально нет гарантий, что этот метод будет вызыван во всех случаях, когда модель удаляется. Ах да, ведь есть сигналы…side effects можно сделать в методе delete? Так мы приходим к выводу, что вообще переопределять delete никогда не стоит. Что, к сожалению, частенько делают. И это, опять же, косвенно свидетельствует о несоблюдении фреймворком принципа «наименьшего удивления».delete уже делает то, что нам нужно — удаляет. И получается, что переопределять его уже не нужно. Если считаете иначе, приведите примеры, когда это может быть необходимо/удобно.delete. Цитата: There’s another set of model methods that encapsulate a bunch of database behavior that you’ll want to customize. In particular you’ll often want to change the way save() and delete() work.
You’re free to override these methods (and any other model method) to alter behavior.
Но это не все, что нужно сделать, чтобы добиться такого поведения.Так в этом и проблема! Нужно об этом банально знать, это неочевидно. В одном месте документации нам пишут «ок, можно переопределять delete». А спустя несколько глав мы понимам, что ведь не все так гладко…
delete в любом случае плохой совет. «Фишка» с QuerySet.delete — просто еще один довод против этого совета.if form.is_valid():
object = form.save(commit=false)
object.save()
form.submit() не вызывает обработчик onsubmit.django предоставляет админку, но не предоставляет optimistic locking«django предоставляет админку»
!= «django предоставляет идеальную админку, которая подходит для всех проектов без исключения». Она поэтому сделана расширяемой.1. Удаление объектов в админкеДжанго админ — это приложение. Самое настоящее, такое. Оно там CRUD и прочее. Не магия! Вы скажете, она должна быть умнее, я скажу чем проще тем лучше. Мне кажется это очевидным: вы зарубили delete (полностью переопределили, даже не взглянув в оригинальный), метод не вызвал ошибки (вы ее не дали вызвать), вы видите, что метод ничего не возвращает — каким образом джанга должна понять, что что-то пошло не так? Через валидаторы — вы же принт не отправили в продакшен? Приложение совершенно точно сообщает вам, что метод отработал без экспешенов и показывает предписанное сообщение, заметим: сама джанга читать не умеет, она еще совсем маленькая.
3. Два админаБлокировку надо где-то хранить, такие штуки нельзя предусмотреть для всех случаев, вы это делаете сами.
delete в случае, когда вы удаляете несколько моделей разом. Это не связано с django-admin — это поведение django-orm.The model’s save() method will not be called, and the pre_save and post_save signals will not be sent.
QuerySet.delete() выполняет одну операцию DELETE ... WHERE <условие>, а не 50 операций DELETE ... WHERE id=<id> в цикле, по-моему, вполне очевидно.Model.save() — то она бы выполнялась 2 раза (т. к. только что была выполнена во время ModelForm.is_valid()). Ну и вообще валидация — это защита от некорректного ввода пользователя, а пользователь должен вводить данные через формы.if user1 == user2.username:
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
После валидации у формы будет доступен form.changed_data — список с названиями измененных полей, который уже можно использовать по своему усмотрению.
Уголок буквоеда. Да, это все равно не устраняет race condition целиком. Но это и не цель. Мне нужно решить задачу правильного поведения в большинстве практических случаев. В остальных случаях люди просто вручную обновят тикет еще раз как надо.
Django работает не так, как вы думаете