【问题标题】:Django: instance needs to have a primary key value before a many-to-many relationshipDjango:实例在多对多关系之前需要有一个主键值
【发布时间】:2011-08-30 18:09:49
【问题描述】:

这是我的模特

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.

如何保存?

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    在添加任何 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)
    

    请注意,当您执行form_obj.save(commit=False) 时,modelform 对象上可以使用save_m2m 方法。如果给模型表单提供 m2m 数据,则应使用 save_m2m 方法。如果你想像你一样手动分配它,你需要像我上面的代码一样单独添加它。

    【讨论】:

    • 感谢乔希!这很有帮助!
    【解决方案2】:

    如果有人仍然在寻找这个问题的答案,我遇到了同样的问题,并且在任何地方都找不到解决方案。

    这是我出错的地方: 在我的模型中,我重写了 save() 方法,以便不将数据保存到我的数据库中。回想起来似乎很明显,但是重写 save() 方法导致了问题,因为我的主键从未真正生成。

    祝你好运!

    【讨论】:

      【解决方案3】:

      在尝试分配给busi.business_type之前保存busi

      【讨论】:

      • if business.is_valid(): busi = business.save() 在它显示的回溯中仍然给我同样的错误busi = business.save()
      【解决方案4】:

      试试这个顺序:

      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
      

      【讨论】:

      • 我在busi.save(commit=False)在线收到一个错误save() got an unexpected keyword argument 'commit'
      • 是的,抱歉,我删除了它,提交参数只是在 ModelForm 实例中使用,而不是在 Model 实例中。
      • 这完全错了@Dantario。您不能分配给business_type。你必须busi.business_type.add(bt),因为它就像一个集合。模型实例上也没有提交 kwarg。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2010-10-24
      • 1970-01-01
      • 2011-12-06
      • 2013-06-07
      • 2011-07-29
      • 2020-09-10
      相关资源
      最近更新 更多