2017-05-20 2 views
0

私は1対1の関係を持つDjangoモデルで作業しています。方法。あなたにいくつかの文脈を与えるために、これは彼らの基数関係を持つ関連するクラスです。Django 1.10 ::両方のインスタンスを同時に1対1の関係で作成する

アフィリエイト(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. 
    [...] 

私は、同じオブジェクトにアフィリエイトとアカウントの両方を参加を検討しましたが、それはちょうどいないようです。それらは異なるモデル実体である。私は実際には1つの場所を除いて常にそれらを常に別々に使用します。特定の組織のアフィリエイトを作成する場合、そのアフィリエイトには作成されたアカウントが必要です。

...私が聞きたいのは、両方のエンティティを同時に作成する方法と、両方を作成して関連付ける方法がありますか?これが私の見解では(AffiliateModelFormポスト)のコードである

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

編集:私はform.save()メソッドをオーバーライドする必要がありますか?それですか?

編集2:明確にすることを忘れました。 AffiliateFormは完全なアフィリエイトモデルのフィールドを持ち、アフィリエイトの編集にも使用されるため、AffiliateFormのsaveメソッドをオーバーライドすることは、アフィリエイトのsaveメソッドをオーバーライドするのと同じくらい効果的です。

答えて

1

私はpre_save/post_save信号にAccountオブジェクトを作成することです、あなたが説明してきたアプローチは、あなたのアカウントにフォームから任意のデータを入れていない、特に以来、別のアプローチが、完全に罰金だと思いますAffiliateにあります。

シグナルを使用すると、Djangoの管理者や別のフォームを使用して、この特定のフォームの外部にアフィリエイトが作成された場合も処理されます。

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

ように、この関連する質問では、1つのテンプレートに複数のフォームを渡すなど、いくつかの選択肢の答えもあります:Django: multiple models in one template using formsは。