Приветствую
Очень часто сталкиваюсь с непониманием, наверное, базовых принципов работы с
django ORM; в связи с чем, боюсь, написанный мною код в очень редких ситуациях может показать свою ненадёжность.
В качестве примера привожу следующий код:
class User(Model):
id = UUIDField(editable=False, primary_key=True)
phone_number = CharField(max_length=15, unique=True)
# Код далее вызывается, например, из django view
with transaction.atomic():
user_queryset = User.objects.filter(phone_number="79998887766")
users_count = user_queryset.count()
if users_count == 1:
return "some data"
elif users_count > 1:
raise ImpossibleError
try:
user_queryset.get_or_create(defaults={"id": uuid4()})
except User.MultipleObjectsReturned as error:
raise ImpossibleError from error
return "some data"
В настройках
django, которые связаны с БД, тип транзакций -
READ COMMITED.
Во-первых, самый основной вопрос (из темы): есть ли необходимость делать проверки
elif users_count > 1 и
except User.MultipleObjectsReturned при условии, что в то же самое
мгновение в другом процессе обновлённое приложение (с применённой миграцией удаления
unique=True) вызовет тот же самый блок кода с маленьким опережением в строке
get_or_create(...)?
Во-вторых:
вот здесь для
OperationalError встретил рекоммендацию "... and not necessarily under the control of the programmer, ... ". Вопрос - почему так? Почему "not necessarily"? Это считается дурным тоном или документ попросту устарел? Стоит ли на уровне
django management.commands или во
views делать обработки исключений, связанные с базой данных? Никогда не видел чтобы кто-то так делал.