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: несколько моделей в одном шаблоне с использованием форм.