2016-03-30 7 views
0

私はdjangoでいくつかのフォームを作成しようとしています。IntegrityError:NOT NULL制約がOneToOneFieldsで失敗しました

私はいくつかのモデル製:

class Identity(models.Model): 
    [...] 

class Move(models.Model): 
    identity = models.OneToOneField(Identity, blank=True) 
    [...] 

とビュー:

def firstform(request): 
    forms = {} 
    if request.method == "POST": 
     forms["move_form"] = MoveForm(request.POST) 
     forms["identity_form"] = IdentityForm(request.POST) 
     if all((forms["move_form"].is_valid(), 
       forms["identity_form"].is_valid())): 
      forms["identity_form"].save() 
      forms["move_form"].identity = forms["identity_form"] 
      forms["move_form"].save() 
      return HttpResponse("OK") 
    else: 
     forms["move_form"] = MoveForm() 
     forms["identity_form"] = IdentityForm() 
    return (render(request, "main/devis.html", forms)) 

をしかし、私はdjango.db.utils.IntegrityError: NOT NULL constraint failed: main_move.identity_idを取得し、私のフォームを送信しようとします。

どうすればこの問題を解決できますか?

+0

あなたのコードのどこにでも 'main_move'が表示されません。このエラーを引き起こす更新されたコードを投稿することはできますか? – gorus

+0

@gorus mainはアプリケーションの名前で、クラスの名前を移動し、estimate_queryはフィールドの名前です:私は2つのフィールドを間違えました!問題はアイデンティティ分野ではありませんでした。 **編集**気にしないでください、私はestimate_queryに関する問題を修正しました。 (私は投稿を編集しました) – vmonteco

答えて

0

私は唯一の私Moveクラスにnull=Trueblank=Trueを交換しなければならなかった、その答えを見つけました。私の悪い:それはかなり愚かだった。

1

私はあなたの代わりに保存された形式で、明示的アイデンティティのインスタンスを割り当てる必要が信じている:

identity = forms["identity_form"].save() 
forms["move_form"].identity = identity 
forms["move_form"].save() 
+0

これはそうではありませんでしたが、両方の表記は機能しますが、これは私にとっては便利です(コードが少ない)。 – vmonteco

0

フォームのsave()メソッドを呼び出すと、インスタンスが返されます。移動フォームではなく、をmoveインスタンスに割り当てる必要があります。

第2に、移動フォームを保存するときにcommit=Falseを使用します。これは、インスタンスがデータベースに保存されないため、IntegrityErrorを取得しないことを意味します。すべてのアイデンティティを移動したい場合は、この方法でnull=Falseをモデルに保存できます。

forms["move_form"] = MoveForm(request.POST) 
    forms["identity_form"] = IdentityForm(request.POST) 
    if all((forms["move_form"].is_valid(), 
      forms["identity_form"].is_valid())): 
     move = forms["move_form"].save(commit=False) 
     identity = forms["identity_form"].save() 
     move.identity = identity 
     move.save() 
     # It's usually a good idea to redirect here rather than 
     # returning a response 
     return HttpResponse("OK") 
関連する問題