2017-06-03 99 views
1

我想将数据保存到中间模型并在模型中进行一些计算(通过重写模型保存)。我遇到的问题是formset无法保存到中间模型。Django formset with manytomany through intermediate model

中介模型仅在存在M2M关系时创建(据我了解)。

我有4种型号,像这样:

Category(models.Model): 
    name = models.CharField(..) 

Tax(models.Model): 
    name = models.CharField(..) 
    rate = models.DecimalField(..) 

CategoryItem(models.Model): 
    category = models.ForeignKey(Category) 
    taxes = models.ManyToManyField(Tax, through='CategoryItemTax', through_fields=('item', 'tax')) 
    quantity = models.DecimalField(..) 
    price = models.DecimalField(..) 

# intermediary model below 
CategoryItemTax(models.Model): 
    category = models.ForeignKey(Category) 
    tax = models.ForeignKey(Tax) 
    item = models.ForeignKey(CategoryItem) 
    rate = models.DecimalField(..) #derived from tax object in the model 
    total_tax = models.DecimalField(..) #calculated in model save 

我我有CategoryItem表单集一类模型的形式。我的views.py如下:

class FormsetMixin(object): 
    object = None 

    def post(self, request, *args, **kwargs): 
     if getattr(self, 'is_update_view', False): 
      self.object = self.get_object() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     formset_class = self.get_formset_class() 
     formset = self.get_formset(formset_class) 
     if form.is_valid() and formset.is_valid(): 
      return self.form_valid(form, formset) 
     else: 
      return self.form_invalid(form, formset) 

    # THE SAVE METHOD 
    def form_valid(self, form, formset): 
     self.object = form.save() 
     formset.instance = self.object 
     instances = formset.save(commit=False) 
     for i in instances: 
      CategoryItemTax.objects.create(category=self.object, item=i, tax=i) 
      CategoryItemTax.save() 

class CategoryCreateView(FormsetMixin, CreateView): 
    template_name='..' 
    model = Category 
    form_class = CategoryForm 
    formset_class = CategoryItemFormSet 

Forms.py如下

class CategoryForm(forms.ModelForm): 

    class Meta: 
     model = Category 

class CategoryItemForm(forms.ModelForm) 
    class Meta: 
     model = CategoryItem 

CategoryItemFormSet = inlineformset_factory(Category, CategoryItem, form=CategoryItemForm, extra=1) 

不幸的是,我得到下面的错误:

Cannot set values on a ManyToManyField which specifies an intermediary model. 
Use category.CategoryItemTax's Manager instead 
+0

你可以显示表单吗? – zaidfazil

+0

我已经添加了forms.py代码。 – Hdman

回答

0

编辑您的看法是这样,

def form_valid(self, form, formset): 
    self.object = form.save() 
    formset.instance = self.object 
    instances = formset.save(commit=False) 
    for each in instances: 
     each.category = self.object 
     each.save() 
     item = CategoryItemTax.objects.create(category=self.object, item=each) 
     item.save() 

多对多相关对象mus先保存以便与另一个实例关联。

+0

'不能在指定中介模型的ManyToManyField上设置值。改为使用category.CategoryItemTax的经理。“ - 这是不断出现的错误。 – Hdman

+0

您需要明白,在此视图中没有创建Tax对象。为了创建多对多关系,需要Tax对象以及CategoryItem对象。如果您想在此解释您要完成的任务,或许我可以提供更多帮助 – zaidfazil

+0

这是一个简单的开票申请,您可以为每个分类项目(订单项)添加多个税款。 – Hdman