Django 1.10:: создание обоих экземпляров в отношениях один к одному одновременно

Я работаю с моделью Django, которая имеет отношения один-к-одному, и мне интересно, делаю ли я это наилучшим из возможных способов. Чтобы дать вам некоторый контекст, это участвующие классы с их основными отношениями.

Партнер (1)----(1) Аккаунт

class Affiliate(models.Model):
    uid = models.CharField(_('Uid'), max_length=128, blank=True, null=True)
    [...]

class Account(models.Model):
    affiliate = models.OneToOneField(Affiliate, on_delete=models.CASCADE) # Here it goes.
    [...]

Я рассматривал возможность присоединения и партнера, и аккаунта к одному объекту, но это не совсем верно. Это разные модельные объекты. Я на самом деле использую их всегда отдельно, за исключением одного места. Когда я создаю аффилированного лица для какой-либо конкретной организации, у этого аффилированного лица должна быть создана учетная запись.

Итак... я хотел бы спросить: есть ли лучший способ создать обе сущности одновременно, а другие - создать и связать их? Это код, на мой взгляд (сообщение для AffiliateModelForm)

    form = AffiliateForm(request.POST)
    if form.is_valid():
        affiliate = form.save()
        account = Account()
        account.affiliate = affiliate
        account.save()

Редактировать: я должен переопределить метод form.save()? Это оно?

Изменить 2: забыл уточнить. AffiliateForm имеет полные поля партнерской модели и также используется для редактирования партнерской программы, поэтому переопределение метода сохранения в AffiliateForm так же хорошо, как переопределение метода сохранения в партнерской программе.

1 ответ

Я думаю, что подход, который вы описали, полностью подходит, хотя альтернативный подход, особенно если вы не вводите данные из формы в учетную запись, заключался бы в создании Account объект в pre_save / post_save сигнал на Affiliate,

Если вы используете сигналы, то вы также решаете, создаются ли филиалы вне этой конкретной формы, например, в админке Django или с использованием другой формы.

https://docs.djangoproject.com/en/dev/topics/signals/

В этом связанном вопросе также есть несколько альтернативных ответов, таких как передача нескольких форм в один шаблон: Django: несколько моделей в одном шаблоне с использованием форм.

Другие вопросы по тегам