2016-04-13 13 views
1

こんにちは私は2つの関連モデルを持っています。私はそれを保存する必要があります。ここ
はモデルである:ここでは関連するモデルを1つのクエリで保存します

Class Company(models.Model): 
    name = models.CharField(
     max_length=255,) 

class ContactPerson(models.Model): 
    company = models.ForeignKey(
     Company, 
     related_name='contact_persons',) 
    name = models.CharField(
     max_length=255,) 

は、ビューの一部である:私は最初のフォームからcompany.idを得るカントので、

class CompanyCreate(JsonView): 
    #JsonView write by me, contains some methods 
    def post(self, *args, **kwargs): 
     data = json.loads(self.request.body) 
     company = CompanyForm(data=data['company']) 
     contacts = ContactForm(data=data['contacts']) 
    if company.is_valid(): 
      company.save() 
      if contacts.is_valid(): 
       contacts.save(commit=False) 
       contacts.company = company 
       contacts.save() 
    return HttpResponse() 

当社が保存されますが、私は、有効な連絡先フォームを傾けます。

+1

私が正しく理解していれば、両方のフォームを検証して両方を保存するか、まったく保存しないでください。なぜなら、もしあなたが 'company.save()'と呼ばれ、新しい会社のインスタンスを作るからです。 –

+0

ああ、私はちょうど保存後にクエリーセットからそれを取得する必要がありますが、このプロジェクトで私は同様に3つの関連モデルを持つフォームを持っています。そして、関連するオブジェクトを1つの形式で保存する方法があります。 –

答えて

2

私はので、あなたが一度にそれらを救うことができるとは思わない:彼らは、一方が他方の前に存在しないように、外部キー関係を持つインスタンスである

  1. これらは3つの異なるモデルインスタンスであるため、それらを1つの形式で組み合わせることは意味がありません。

あなただけ有効であり、無効であるものを拒絶するものを保存したい場合は、あなたが現在行うことsave()関数の戻り値を捕捉し、1回の変更で十分です:

class CompanyCreate(JsonView): 
    #JsonView write by me, contains some methods 

    def post(self, *args, **kwargs): 
     data = json.loads(self.request.body) 
     company_form = CompanyForm(data=data['company']) 
     contacts_form = ContactForm(data=data['contacts']) 
    if company_form.is_valid(): 
      company = company_form.save() 
      if contacts.is_valid(): 
       contacts = contacts_form.save(commit=False) 
       contacts.company = company 
       contacts.save() 
    return HttpResponse() 

"すべてまたはなし"ロジックを使用する場合は、すべてが有効であればすべて保存するか、何も保存しない場合は、ModelFormの外部キーを除外して、フォームを有効にするときに検証を無視します。 ForeignKeyが存在するが他のすべてのフィールドは存在しない。それが意味をなさないかどうかを見てください

+0

ありがとう、素敵な答え –

関連する問題