0

我遇到了鸡和蛋的情况。我有一个表单集,用户可以在其中修改现有数据。实例不应直接保存,而是应作为新对象添加。

for fm in attached_deals_formset:                
    if fm.has_changed():
        modified_deal = fm.save(commit=False)
        deal = Deal.objects.create(deal_id = modified_deal.deal_id, ... )
        for item in modified_deal.sales_item: #m2m
            deal.sales_item.add(item)
        deal.save_m2m();

我的问题是 sales_item 是一个 m2m 字段。只需遍历它就会崩溃:

for item in modified_deal.sales_item:

'Deal' 实例需要有一个主键值才能使用多对多关系。

不过我不明白,这些是用户在 modified_deal 中选择的多选,为什么只遍历它就会抛出异常?我怎么能解决这个问题?

4

1 回答 1

0

我找到了解决方案。 modified_deal = fm.save(commit=False)仅包含类值。m2m 字段指向单独的表,因此尚未设置。

为了访问用户的 m2m 选择,只需将该字段用作form.cleaned_data[]模型的相当部分的一部分:

    modified_deal = fm.save(commit=False)
    deal = Deal.objects.create(deal_id = modified_deal.deal_id, ... )
    for item in fm.cleaned_data['sales_item']:
         deal.sales_item.add(item)
    deal.save();

这对我有用。

于 2012-09-26T08:54:07.307 回答