Django,无法使用save()方法从管理界面保存ManyToMany字段

时间:2014-01-09 08:56:28

标签: django django-models

我正在尝试在保存模型时保存/创建ManyToMany关系。这是我的代码:

class Invoice(models.Model):
    name = models.CharField(max_length=64)
    product_ids = models.CharField(max_length=128, default='')
    products = models.ManyToManyField(Product, null=True, blank=True)

    def save(self, *args, **kwargs):
        super(Invoice, self).save(*args, **kwargs)
        if self.product_ids:
            ids = self.product_ids.split(',')
            for id in ids:
               product = Product.objects.get(id=id)
               self.products.add(product)
            super(AllAroundCompetition, self).save(*args, **kwargs)

这是自我解释。有时我想手动创建发票,我不想在按“ctrl”的同时浏览整个列表以选择许多产品。所以我添加了一个愚蠢的额外字段来以逗号分隔的方式传递id(例如25,27,90,20)。这是product_ids字段。我重新使用save()方法来创建这些M2M关系。但它不起作用。发票已创建,但关系不是。

我做错了什么?

(使用django 1.5)

2 个答案:

答案 0 :(得分:1)

您正在调用方法底部的super(AllAroundCompetition, self).save(…)。将对象添加到m2m关系后,根本不需要save调用,而调用另一个类的save可能会搞砸。

我建议使用替代解决方案:在管理员的products字段中尝试using a filter_horizontal。它有一个更好的用户界面,包括搜索。不再需要ctrl-holding:

class InvoiceAdmin(admin.ModelAdmin):
    filter_horizontal = ('products',)

答案 1 :(得分:1)

M2M关系更改保存在数据库的单独表中。 因此,save方法仅保存模型本身,在数据库中的适当表格中对模型进行更改后保存关系,例如,在创建新模型时,必须在数据库中创建(保存方法)以添加M2M外键。

TL; DR: 尝试重写方法ModelAdmin.save_related(self,request,form,formsets,change) (您可能必须为此模型创建模型管理类并注册它)