【问题标题】:Django admin - instance needs to have a primary key value before a many-to-many relationship can be usedDjango admin - 实例需要有一个主键值才能使用多对多关系
【发布时间】:2011-06-20 14:40:57
【问题描述】:

编辑:我之前并不清楚,我将我的对象保存在 django 管理面板中,而不是在视图中。即使我保存没有多对多关系的对象,我仍然会收到错误。

我有一个名为TogglDetails 的模型,它与标准django User 模型具有ForeignKey 关系,并与名为Tag 的模型具有MayToManyField 关系。我已经在 django admin 中注册了我的模型,但是当我尝试保存 TogglDetails 实例时,标题中出现错误。

这是我的模型:

class Tag(models.Model):
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name


class TogglDetails(models.Model):
    token = models.CharField(max_length=100)
    user = models.ForeignKey(User)
    tags = models.ManyToManyField(Tag, blank=True, null=True)

    def __unicode__(self):
        return self.user.username

    class Meta:
        verbose_name_plural = "toggl details"

据我所知,我的模型应该没有问题,django 管理员应该只保存实例而没有任何问题。有什么明显的我遗漏的吗?

我正在使用 Django 1.3

【问题讨论】:

  • 我也遇到了同样的问题……我以前好像不记得了……谁知道呢。
  • 你能粘贴错误吗?

标签: django django-admin


【解决方案1】:

我的问题的答案是这样的:Postgres sequences without an 'owned by' attribute do not return an id in Django 1.3

我的 postgres 数据库中的序列没有设置“拥有者”属性,因此在将新条目保存到数据库时没有返回 id。

【讨论】:

  • 从 Postgres 切换到 Sqlite 解决了我的问题。
【解决方案2】:

正如其他用户所说:

没有“拥有者”属性的 Postgres 序列在 Django 1.3 中不会返回 id

我的 postgres 数据库中的序列没有设置“拥有者”属性,因此在将新条目保存到数据库时没有返回 id

此外: 这很可能是由于向后不兼容的更改导致自定义模型中的某些主键类型超出 Django 1.3 的范围。有关更多信息,请参阅 Django trac 票证 https://code.djangoproject.com/ticket/13295http://code.djangoproject.com/ticket/15682

我通过对受影响的表/序列运行以下命令解决了这个问题。

具体运行命令:

manage.py dbshell
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

更改 tablename_colname_seq 和 tablename.colname

【讨论】:

    【解决方案3】:

    不要让我们猜测并将错误消息添加到您的问题中,这会提供有关失败位置的大部分信息。

    您是否导入了 User 模型?

    from django.contrib.auth.models import User
    

    【讨论】:

    • 是的,我已经导入了User模型,错误信息在标题ValueError: 'TogglDetails' instance needs to have a primary key value before a many-to-many relationship can be used.
    【解决方案4】:

    我也遇到过这个问题,我唯一能做的就是将 M2M 字段设为空白,直到我点击保存并继续编辑后才设置它们。

    我认为这可能只是一个框架缺陷,因为您会注意到管理站点的用户部分也有一个非常严格的“您只能在保存模型之前编辑这些字段”。

    所以我的建议是采用该方案,并隐藏 M2M 表单字段,直到模型具有主键。

    【讨论】:

      【解决方案5】:

      我尝试了使用 CPython 的 Django 1.3,具有不同的数据库设置。我从问题中复制粘贴了模型,并做了一些更改:首先我添加了

      from django.contrib.auth.models import User
      

      在文件的顶部,我将Tag 的引用放在引号之间。那不应该有任何区别。此外,我创建了以下 admin.py:

      from django.contrib import admin
      import models
      
      admin.site.register(models.Tag)
      admin.site.register(models.TogglDetails)
      

      对于 Sqlite3,所描述的问题不会发生,对于 MySQL 也不会发生。所以我尝试了使用 postgresql_psycopg2 后端的 PostgreSQL。同样的事情:我无法重现错误。

      据我所知,问题中的代码没有任何问题。问题肯定出在其他地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-06
        • 2010-10-24
        • 2011-08-30
        • 2013-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        相关资源
        最近更新 更多