Django: норма для обработки не созданных полей OneToOneFields

#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 для любых новых пользователей. Есть ли какой-либо стандартный способ справиться с этим для старых пользователей? Кажется, существует множество возможных решений, но ни одно из них не кажется очень чистым:

  1. Я мог бы try: catch RelatedObjectDoesNotExist каждый раз, когда использую user.invite . Это не очень здорово и кажется очень нечистым.
  2. Я мог бы создать метод доступа, например get_invite_code , который выполняет try/catch , и всегда извлекать user.invite_code через user.get_invite_code()
  3. Я мог бы запустить миграцию, чтобы у всех старых пользователей был создан код приглашения, а у всех новых пользователей был объект кода приглашения через сигнал.

У кого-нибудь есть какие-либо предложения по наиболее питоническому способу справиться с этим?

Комментарии:

1. Поскольку это одноразовое действие, которое необходимо выполнить при обновлении схемы, необходимо выполнить миграцию.

2. Возня со старым кодом всегда недостаточно ясна. Но самый выразительный способ лучше всего подходит для меня ( создание метода доступа может помочь вам вспомнить, что вы будете иметь дело со старыми случаями ). Это личное.