@rodion4dev

Стоит ли обрабатывать Model.MultipleObjectsReturned ошибку после Model.objects.count()?

Приветствую

Очень часто сталкиваюсь с непониманием, наверное, базовых принципов работы с 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 делать обработки исключений, связанные с базой данных? Никогда не видел чтобы кто-то так делал.
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bacon
1. unique=True оно на уровне БД, не может быть еще одной такой же записи, не нужно делать проверки count и ловить MultipleObjectsReturned
2. если у тебя в этот же момент, что-то удаляет unique=True, то ты ССЗБ
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы