Django:实例需要在多对多关系之前拥有主键值

时间:2011-05-22 21:20:46

标签: django django-models django-views

这是我的模特

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.

我如何保存?

4 个答案:

答案 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