Django - вставка без возврата идентификатора сохраненного объекта - PullRequest
2 голосов
/ 07 июня 2011

Каждый раз, когда метод save() вызывается для объекта Django, Django выполняет два запроса: один INSERT и один SELECT.В моем случае это полезно, за исключением некоторых конкретных мест, где каждый запрос стоит дорого.Любые идеи о том, как иногда утверждать, что никакой объект не нужно возвращать - не нужно SELECT.

Также я использую django-mssql для подключения, эта проблема некажется, существует на MySQL.

РЕДАКТИРОВАТЬ: Лучшее объяснение

h = Human()
h.name='John Foo'
print h.id # Returns None, No insert has been done therefore no id is available
h.save()
print h.id # Returns the ID, an insert has taken place and also a select statement to return the id

Иногда мне не нужен идентификатор перезапуска, просто вставьте

Ответы [ 3 ]

0 голосов
/ 07 июня 2011

40ins ответ был верным, но, вероятно, он мог бы иметь более высокую стоимость ...

Когда django исполняет save () , это нужно былоуверен, если объект новый или существующий.Таким образом, он попадает в базу данных, чтобы проверить, существует ли связанный объект.Если да, он выполняет ОБНОВЛЕНИЕ , иначе он выполняет ISERT

Проверка документация отсюда ...

Вы можете использовать force_insert или force_update , но это может привести к серьезным проблемам с целостностью данных, таким как создание дублирующей записи вместо обновления существующей ...

, если вы хотите использовать force , вы должны быть уверены, будет ли это INSERT или UPDATE ...

0 голосов
/ 19 января 2012

Дополнительным выбором является бэкэнд django-mssql, получающий значение идентификатора из таблицы для определения только что вставленного идентификатора. Если этот выбор медленный, значит что-то не так с вашим сервером / конфигурацией SQL, потому что он только делает SELECT CAST(IDENT_CURRENT(*table_name*) as bigint) вызов.

0 голосов
/ 07 июня 2011

Попробуйте использовать метод save() с атрибутами force_insert или force_update.С этими атрибутами django знает о существовании записи и не делает дополнительного запроса.

...