Улучшение производительности Model.save() в Django | Кодементор
Если вы когда-либо использовали Django в своей карьере, вы, должно быть, взаимодействовали с Django ORM. Это потрясающее программное обеспечение, которое упростило написание таблиц базы данных, установку внешних ключей и индексов.
В недавнем проекте я заметил, что Member.save() выполняет два SQL-запроса: один для UPDATE, а другой для INSERT. Два запроса выполнялись для одного и того же .save(), что было удивительно, поскольку объект создавался впервые, поэтому ORM не требовалось выполнять запрос UPDATE.
class Member(models.Model):
mid = models.PrimaryKey(default=gen_mid)
name = models.CharField(max_length=200)
При дальнейшем осмотре и просмотре документации Django Model Instance я наткнулся на эту строку:
Если для атрибута первичного ключа объекта установлено значение, которое оценивается как True (т. е. значение, отличное от None или пустой строки), Django выполняет UPDATE.
Если атрибут первичного ключа объекта не установлен или если UPDATE ничего не обновил (например, если для первичного ключа установлено значение, которого нет в базе данных), Django выполняет INSERT.
Поскольку я генерировал значение по умолчанию для первичного ключа модели Member, ORM сначала выполнял UPDATE (что не удалось), а затем выполнял INSERT в базе данных. Документация Django также объясняет обходной путь для этой проблемы.
В некоторых редких случаях необходимо иметь возможность заставить метод save() выполнять SQL INSERT и не возвращаться к выполнению UPDATE. Или наоборот: обновить, если возможно, но не вставлять новую строку. В этих случаях вы можете передать параметры force_insert=True или force_update=True методу save(). Передача обоих параметров является ошибкой: вы не можете вставлять и обновлять одновременно!
Вот оно. Просто перейдя с Member.save() на Member.save(force_insert=True), когда я был уверен, что создается новый объект, я изменил его с запроса UPDATE или INSERT на запрос INSERT. Как раз то поведение, которое я ожидал.
Django продолжает оставаться фантастической веб-платформой с документацией, содержащей актуальную информацию, которая может привести к значительному увеличению производительности. Кто-то, кто начинает с Django, вероятно, не должен беспокоиться об использовании force_insert или force_update, и в этом красота. Это просто работает!