Создание заблокированного объекта

Допустим, у меня есть класс модели 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()

Все хорошо, за исключением того, что это кажется немного избыточным, чтобы повторно получить объект, который у меня уже есть.

Есть ли способ

  1. select_for_update when creating a new object, or to
  2. select_for_update the foo itself after it was created, but without refetching it, or
  3. is the above the best approach when one needs to create an object and then do some modifications after the fact?
Вернуться на верх