Django admin - instance需要具有主键值才能使用多对多关系

时间:2011-06-20 14:40:57

标签: django django-admin

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

我有一个名为TogglDetails的模型,与标准django ForeignKey模型有User关系,与MayToManyField模型有Tag关系。我已经使用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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

正如其他用户所说:

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

我的postgres数据库中的序列没有设置“Owned by”属性,因此当新条目保存到db时没有返回id

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

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

专门运行命令:

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

更改tablename_colname_seq和tablename.colname

答案 2 :(得分:0)

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

您是否导入了用户模型?

from django.contrib.auth.models import User

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

我使用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。同样的事情:我无法重现错误。

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

相关问题