Создание заблокированного объекта
Допустим, у меня есть класс модели Foo
. Структура не имеет значения.
Я хочу:
foo = Foo.objects.create(...)
# Do some stuff
foo.bar = "something"
foo.save()
Это, конечно, небезопасно, поскольку другой проект может получить только что созданный экземпляр Foo
и изменить его в то же самое время, причем окончательный save
переопределит тот, который произошел раньше. Использование update_fields
может снизить риск, но он все еще существует для процессов, которые изменяют одно и то же поле (bar
, в моем примере выше).
Обходной путь для этого следующий:
foo = Foo.objects.create(...)
with transaction.atomic():
foo = Foo.objects.select_for_update().get(pk=foo.pk)
# Do some stuff
foo.bar = "something"
foo.save()
Все хорошо, за исключением того, что это кажется немного избыточным, чтобы повторно получить объект, который у меня уже есть.
Есть ли способ
select_for_update
when creating a new object, or toselect_for_update
thefoo
itself after it was created, but without refetching it, or- is the above the best approach when one needs to create an object and then do some modifications after the fact?