这是我的模特
class Business(models.Model):
business_type = models.ManyToManyField(BusinessType)
establishment_type = models.ForeignKey(EstablishmentType)
website = models.URLField()
name = models.CharField(max_length=64)
def __unicode__(self):
return self.name
在我看来,我正在尝试按如下方式保存记录:
business = BusinessForm(request.POST or None)
if business.is_valid():
busi = business.save(commit=False)
bt = BusinessType.objects.get(id=6)
busi.business_type = bt
et = EstablishmentType.objects.get(id=6)
busi.establishment_type = et
busi.save()
然而,它给了我一个错误
'Business' instance needs to have a primary key value before a many-to-many relationship can be used.
我如何保存?
答案 0 :(得分:27)
在添加任何m2m字段之前,您需要保存模型的实例。请记住,您必须使用.add()
方法添加m2m字段,而不是直接将其分配给字段。
if business.is_valid():
busi = business.save(commit=False)
et = EstablishmentType.objects.get(id=6)
busi.establishment_type = et
busi.save()
bt = BusinessType.objects.get(id=6)
busi.business_type.add(bt)
请注意,执行save_m2m
时,modelform
对象上可以使用form_obj.save(commit=False)
方法。如果为模型表单指定了m2m数据,则应使用save_m2m方法。如果你想像你一样手动分配它,你需要像我上面的代码一样单独添加它。
答案 1 :(得分:1)
如果有人在那里仍然在寻找答案,我遇到了同样的问题,无法在任何地方找到解决方案。
这是我出错的地方: 在我的模型中,我重写了save()方法,以便不将数据保存到我的数据库中。回想起来似乎很明显,但是覆盖save()方法会导致问题,因为我的主键实际上从未生成过。
祝你好运!答案 2 :(得分:0)
在尝试分配到busi
之前保存busi.business_type
。
答案 3 :(得分:0)
尝试这个顺序:
if business.is_valid():
busi = business.save(commit=False)
et = EstablishmentType.objects.get(id=6)
busi.establishment_type = et
busi.save() #with commit == true
bt = BusinessType.objects.get(id=6)
busi.business_type = bt
busi.save() #here you save many to many