我正在尝试在保存模型时保存/创建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)
答案 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) (您可能必须为此模型创建模型管理类并注册它)