TL; DR "Есть ли встроенный способ сделать экземпляры модели с одним и тем же первичным ключом одним и тем же объектом?" Нет .
Объект python в памяти - это не то же самое, что строка в вашей базе данных. Поэтому, когда вы создаете a_note
и затем извлекаете same_note
из базы данных, это два разных объекта в памяти , даже если они представляют собой одно и то же представление базовой строки в вашей базе данных. Когда вы выбираете same_note
, фактически вы создаете новый объект Notes
и инициализируете его значениями, извлеченными из базы данных.
Затем вы изменяете и сохраняете same_note
, но объект a_note
в памяти не изменился. Если бы вы сделали a_note.refresh_from_db()
, вы бы увидели, что a_note.message
был изменен.
Теперь a_note is same_note
всегда будет False
, потому что расположение в памяти этих двух объектов всегда будет различным. Две переменные одинаковы (is
равно True), если они указывают на один и тот же объект в памяти.
Но a_note == same_note
вернет True
в любое время, поскольку Django определяет два экземпляра модели равными , если их pk
одинаковы .
Обратите внимание, что если речь идет о сложности, то в случае нескольких запросов один запрос может измените базовые значения, которые используются другим запросом, затем используйте от F
до , избегайте условий гонки .
В рамках одного запроса, поскольку все является последовательным и однопоточным, нет риска, что переменные выйдут из-под контроля c: Вы знаете порядок, в котором все делается, и поэтому всегда можете вызвать refresh_from_db()
, когда вы знаю, что предыдущий вызов метода мог изменить значение базы данных.
Обратите также внимание: наличие двух переменных, содержащих одну и ту же строку, означает, что вы выполнили два запроса к вашей базе данных, чего вам следует избегать при все стоит. Поэтому вы должны подумать, почему у вас такая ситуация.