@YuriyCherniy

Уместно ли гарантировать атомарность транзакции в моём случае?

Написал тег, который берёт данные из профиля супер юзера и передаёт в шаблон. Но при первом открытии страницы сайта Django ругается на отсутствие профиля у супер юзера. Чтобы не лезть в админку или шел для создания профиля дописал конструкцию try/finally. Есть ли смысл в таком простом случае гарантировать атомарность transaction.atomic() если до IntegrityError с базой данных никаких манипуляций не производилось?

@register.simple_tag
def get_brand():
    '''
    set brand name instead of 'Главная' in the navbar
    '''
    try:
        with transaction.atomic():
            UserProfile.objects.create(user_id=1)
    finally:
        return UserProfile.objects.first().brand
  • Вопрос задан
  • 47 просмотров
Решения вопроса 1
@mrxor
Simple is better than complex
Нет, заворачивать в транзакцию одну операцию смысла нет.
Но я бы переписал ваш код так:
@register.simple_tag
def get_brand():
    '''
    set brand name instead of 'Главная' in the navbar
    '''
    try:
        user_profile = UserProfile.objects.get(user_id=1)
    except UserProfile.DoesNotExist:
        user_profile = UserProfile.objects.create(user_id=1)
    return user_profile.brand

Или посмотрите в сторону get_or_create
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@bacon
Повести создание UserProfile на сигнал при создании юзера
Ответ написан
@pyHammer
@register.simple_tag
def get_brand():
    '''
    set brand name instead of 'Главная' in the navbar
    '''
    user_profile, _ = UserProfile.objects.get_or_create(user_id=1)
    return user_profile.brand
Ответ написан
Ваш ответ на вопрос

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

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