1
deals_formset_factory = modelformset_factory(Deal, form=DealCForm, extra=1)    
attached_deals_formset = deals_formset_factory(request.POST, prefix='deals')

モデルの一部のフィールドがDealフォームに表示されないため、ユーザーが設定できないため(ただし、M2Mフィールドが表示され、ユーザーが設定できます)、

for fm in attached_deals_formset:                
    if fm.has_changed(): 
       fm.save()

壊れてしまうので。

したがって、理論的には、そのような状況でのアイデアは

deal = fm.save(commit=False)
...
deal.save()

しかし、これは私のM2Mフィールドを取引内に保存しません。スルーテーブルはそのままです。これを解決するための最良のアプローチは何ですか?

class Deal(models.Model):            
    deal_id             = UUIDField()
    ....
    sales_item          = models.ManyToManyField(SalesItem)    
4

1 に答える 1

3

私は解決策を見つけました。saveメソッドをオーバーライドする必要はありません。

commit = Falseを使用することの別の副作用は、モデルが別のモデルと多対多の関係にある場合に見られます。モデルに多対多の関係があり、フォームを保存するときにcommit = Falseを指定した場合、Djangoは多対多の関係のフォームデータをすぐに保存できません。これは、インスタンスがデータベースに存在するまで、インスタンスの多対多のデー​​タを保存できないためです。

この問題を回避するために、commit = Falseを使用してフォームを保存するたびに、Djangoはsave_m2m()メソッドをModelFormサブクラスに追加します。フォームによって生成されたインスタンスを手動で保存した後、save_m2m()を呼び出して、多対多のフォームデータを保存できます。

ソース

単純にdeal.save()の後:

fm.save_m2m()
于 2012-09-19T10:15:14.993 に答える