Django — Вставить без возврата идентификатора сохраненного объекта

#django #save #django-mssql

#django #Сохранить #django-mssql

Вопрос:

Каждый раз, когда save() метод вызывается для объекта Django, Django выполняет два запроса один INSERT и one 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
  

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

Комментарии:

1. Ну, это странно, MSSQL поддерживает INSERT...OUTPUT , поэтому я не понимаю, почему он выдает два запроса, но опять же, я не настолько знаком с django-mssql . Возможно, вы могли бы создать свои собственные инструкции INSERT для дорогостоящих запросов?

Ответ №1:

ответ 40ins был правильным, но, вероятно, это может привести к более высоким затратам…

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

Проверьте documentatin отсюда

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

Итак, если вы хотите использовать силу, вы должны быть уверены, будет ли это ВСТАВКА или ОБНОВЛЕНИЕ…

Ответ №2:

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

Комментарии:

1. Проблема не в том, проверяет django наличие или нет, а в том, что после каждого INSERT он запускает SELECT инструкцию, просто чтобы сохранить объекты id под рукой.

Ответ №3:

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