#python #django
#питон #джанго
Вопрос:
Вот пример модели:
class User(models.Model): ...
Позже я хочу добавить модель Invite OneToOne:
# This is arbitrarily named. class InviteCode(models.Model): user = models.OneToOneField(User, related_name="invite_code") ... # signals.py @receivers(signals.post_save, sender=User) def create_invite_code(sender, instance, created, **kwargs): if created: invite_code = InviteCode.objects.create(user=user)
Теперь для новых пользователей я могу удобно сделать user.invite_code
для любых новых пользователей. Есть ли какой-либо стандартный способ справиться с этим для старых пользователей? Кажется, существует множество возможных решений, но ни одно из них не кажется очень чистым:
- Я мог бы
try:
catch RelatedObjectDoesNotExist
каждый раз, когда используюuser.invite
. Это не очень здорово и кажется очень нечистым. - Я мог бы создать метод доступа, например
get_invite_code
, который выполняетtry/catch
, и всегда извлекатьuser.invite_code
черезuser.get_invite_code()
- Я мог бы запустить миграцию, чтобы у всех старых пользователей был создан код приглашения, а у всех новых пользователей был объект кода приглашения через сигнал.
У кого-нибудь есть какие-либо предложения по наиболее питоническому способу справиться с этим?
Комментарии:
1. Поскольку это одноразовое действие, которое необходимо выполнить при обновлении схемы, необходимо выполнить миграцию.
2. Возня со старым кодом всегда недостаточно ясна. Но самый выразительный способ лучше всего подходит для меня ( создание метода доступа может помочь вам вспомнить, что вы будете иметь дело со старыми случаями ). Это личное.