实例需要有一个主键值才能使用多对多关系

Posted

技术标签:

【中文标题】实例需要有一个主键值才能使用多对多关系【英文标题】:instance needs to have a primary key value before a many-to-many relationship can be used 【发布时间】:2012-10-06 23:18:21 【问题描述】:

我现在要生气了 - 我无法创建新的团队实例。 Django总是显示错误:'Team' instance needs to have a primary key value before a many-to-many relationship can be used.

这是我的模型:

from django.contrib.auth.models import User
from django.db import models

class Team(models.Model):
    name = models.CharField(max_length=10)
    members = models.ManyToManyField(User)

    def save(self, *args, **kwargs):
        if self.pk:
            # for later use
            pass
        super(Team, self).save(*args, **kwargs)

现在我想创建一个新团队...

from django.contrib.auth.models import User
from models import Team

user_obj = User.objects.get(pk=1)
new = Team()
new.name = 'aaa'
new.save()
new.members.add(user_obj)

有人能看出错误吗?

编辑 我已经阅读了文档和这个(非常好的)答案How to create an object for a Django model with a many to many field? - 仍然无法弄清楚出了什么问题

【问题讨论】:

这段代码看起来是正确的。也许错误位于其他地方?这是您的整个代码还是被截断?您可以发布完整的堆栈跟踪吗? 有一个自定义保存方法 - 但它只调用 super(Team, self)...- 这是堆栈跟踪:dpaste.com/814410 我能看到这种情况发生的唯一方法是你的 save() 方法没有提交到数据库。请包含您的自定义 save() 方法的代码。 用 save() 方法更新问题 【参考方案1】:

啊,它在你的 save() 方法中。试试这个修复:

def save(self, *args, **kwargs):
    obj = super(Team, self).save(*args, **kwargs)
    if obj.id:
        # for later use
        pass
    return obj

【讨论】:

【参考方案2】:

@init3 接受的答案对我不起作用,因为 obj 一直解析为“NoneType”,换句话说,对 super 的调用没有返回任何内容。让它工作:

def save(self, *args, **kwargs):
    super(Team, self).save(*args, **kwargs)
    if self.pk:
        pass

【讨论】:

以上是关于实例需要有一个主键值才能使用多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的多对多关联关系

多对多关系的联结表是不是应该具有代理主键?

多对多表应该有一个主键吗?

ejb3:用简单的主键映射多对多关系

Django:对象需要具有字段“...”的值才能使用这种多对多关系

Hibernate的多对多关系