Предотвращение запроса select по внешнему ключу, когда известен первичный ключ

#python #sql #django

#python #sql #django

Вопрос:

чтобы вставить строку в таблицу, имеющую отношение «один к одному», вы должны сделать это в Django:

 mypk=2   # Comes from the POST request
model=MyModel(myField="Hello", myForeignModel=ForeignModel.objects.get(pk=mypk))
model.save()
  

Это вызовет запрос SELECT, за которым последует запрос INSERT.

Однако запрос SELECT на самом деле не нужен, поскольку это будет mypk то, что вставляется в поле foreign key. Есть ли способ заставить Django просто вставить первичный ключ, не выполняя SELECT?

Во-вторых, существуют ли здесь проблемы с параллелизмом (в случае, если первичный ключ изменится до того, как пользователь отправит запрос). Если да, то как с ними справляются?

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

1. Похоже, вы все равно хотели бы загружать mypk до этого, чтобы проверить, что значения формы действительны, что у пользователя есть разрешение и т.д.

2. mypk хранится в Javascript и отправляется AJAX-запросом. У всех пользователей есть разрешение, и оно защищено от CSRF.

Ответ №1:

Из документов:

За кулисами Django добавляет "_id" к имени поля, чтобы создать имя столбца базы данных.

Просто установите myForeignModel_id значение FK.

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

1. Идеальный. Протестировал это с помощью профилировщика SQL, и запрос SELECT исчез.