在django-admin中更新记录的问题

时间:2009-11-18 20:24:21

标签: django postgresql django-admin models

我正在使用Django(特别是django-admin)作为使用PHP进行面向客户端功能的网站的管理面板。我一直在搞乱管理员看起来我想要的方式,到目前为止一切都那么好。但是,我遇到了一些我需要解决的问题。

以下是我正在使用的模型:

class Permissions(models.Model):
    id = models.IntegerField(primary_key=True)
    league_key = models.CharField(max_length=15) 
    commissioner_id = models.ForeignKey(Accounts, db_column='commissioner_id',
                                        to_field='id')
    status = models.IntegerField()
    key = models.CharField(max_length=50)
    publisher_key = models.CharField(max_length=25)
    publisher_display_name = models.CharField(max_length=50)
    base_league = models.ForeignKey('self', db_column='id')
    share = models.IntegerField()
    default_fixture_key = models.CharField(max_length=50)

    def __unicode__(self):
        return self.publisher_key + ' / ' + self.league_key

    class Meta:
        db_table = u'permissions'
        verbose_name = 'Permissions'
        verbose_name_plural = 'Permissions'

class PermissionsAdmin(admin.ModelAdmin):
    list_display = ('league_key', 'publisher_key', 'commissioner_id', 'status',
                    'base_league', 'share', 'default_fixture_key')
    list_display_links = ('league_key','commissioner_id', 'base_league')
    exclude = ('id',)

第一个问题是编辑现有记录的管理表单是根据需要标记其中一个字段。当需要字段而不是必需字段时,如何告诉django-admin?

我遇到的第二个问题是,当我告诉它保存此记录时,我收到以下错误:重复键值违反了唯一约束“permissions_pkey”。这让我觉得Django没有做更新,它试图做一个INSERT

我也想到这可能是与Postgresql相关的问题。 permissions_pkey是该表的约束,跟踪用于自动递增该表的id的序列

虽然Django文档很棒,但它们似乎没有我需要的信息来解决这个问题。

(编辑:深入到堆栈跟踪中,我找到了这个非常棒的小金块:

sql 
'UPDATE "permissions" SET "league_key" = E\'l.1258472565 \', "commissioner_id" = 7,
 "status" = 0, "key" = E\'cfcd208495d565ef66e7dff9f98764da \', 
"publisher_key" =     E\'chrishartjes.com \', 
"publisher_display_name" = E\'Chris Hartjes Free Press \', 
"id" = 744, "share" = 0, 
"default_fixture_key" = E\'\' WHERE "permissions"."id" = 745 '

这导致我认为我的小外键入口导致了问题)

3 个答案:

答案 0 :(得分:2)

问题1:请参阅有关设置nullblank的文档。简短的说明:设置null将允许DB存储空值。您在这里(最有可能)想要的是将blank设置为True,以便在验证模型时不需要该字段。如果该字段不是CharField,则还应将null设置为True。请参阅此处的文档:http://docs.djangoproject.com/en/dev/ref/models/fields/#field-options

问题2:我相信你想要的是AutoField,而不是IntegerField。不同之处在于AutoField会在保存新对象时自动为您创建新ID。请参阅此处的文档:http://docs.djangoproject.com/en/dev/ref/models/fields/#autofield

修改(来自我的评论)再看一下,我看到错误引用了permissions_pkey。尝试将id字段替换为pkey = AutoField(primary_key=True)

答案 1 :(得分:1)

  1. 在该字段上,如果不需要该字段,请将null=True放在字段构造函数中。编辑:评论者说blank=True - 他可能是对的 - 我没有在我面前的文档。
  2. 如果ID为空,则执行插入;如果ID具有值,则执行更新。不知道你正在谈论的保存在哪里发生,但这些信息可能会有所帮助。 (有一个删除的答案,指出排除('id')可能导致这个问题 - 我认为这也是正确的)
  3. 另外,我同意文档。如果您可以阅读python,我强烈建议您尝试阅读您想要弄清楚的区域的Django源代码。源代码是我读过的最好,最可读的源代码。我从来没有遇到过跳入并阅读它的问题 - 它几乎和文档一样好。

答案 2 :(得分:0)

  1. null = True,空白= True

  2. 您不需要在Permissions模型中明确拥有“id”列,我相信这是造成您第二个问题的原因。