2009-11-18 85 views
1

更新记录的问题我使用Django(特别是Django的管理)成为面向客户端功能使用PHP的网站的管理面板。我一直在搞管理看起来完全是我想要的方式,并且非常好。但是,我遇到了一些我需要解决的问题。在Django的管理更新记录

下面是我的工作模型:

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的管理员,当一个字段是必需的,而不是必需的?

我遇到的第二个问题是,当我告诉它保存此记录时,出现以下错误:重复键值违反了唯一约束“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 ' 

这使我认为,我的小ForeignKey的自身项导致问题)

+0

我编辑了您的问题并删除了所有HTML标记。你能检查一下'class Meta'是否正确缩进? – 2009-11-18 20:30:19

+0

是的,对不起。 – GrumpyCanuck 2009-11-18 20:35:13

回答

1
  1. 在该字段中,如果该字段不是必需的,则将null=True放在字段构造函数中。编辑:评论者说blank=True - 他可能是对的 - 我没有在我面前的文档。
  2. 它在ID为空时执行插入,如果ID为值,则执行更新。不知道你正在谈论的节目在哪里发生,但该信息可能会有所帮助。 (有一个删除的答案指出排除('id')可能导致此问题 - 我认为这也是正确的)

此外,我同意文档。如果您可以阅读python,我强烈建议您尝试阅读您想要了解的区域的Django源代码。源代码是我读过的最好,最可读的源代码。我从来没有遇到任何问题,只是跳进来阅读它 - 它几乎和文档一样好。

+1

'blank = True'将使字段不是必需的。 'null = True'只影响数据库中空白字段允许的空值;它不影响验证 – 2009-11-18 20:30:44

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。尝试用pkey = AutoField(primary_key=True)替换id字段。

+0

在空白处添加=对于有问题的字段为True,现在它工作得很好。更改为AutoField似乎没有做任何事情来解决报告的pkey错误问题,并且我也删除了排除('id')行。 :( – GrumpyCanuck 2009-11-18 20:48:19

+0

你需要在切换到AutoField后删除并重新创建你的表格。事实上,我建议你不要在'id'字段中完全放弃 - Django会自动添加它,如果你这样做的话。 – 2009-11-18 21:02:40

+0

我不能删除并重新创建表,因为它充满了工作数据 – GrumpyCanuck 2009-11-18 21:05:27

0
  1. 空=真,空=真

  2. 你并不需要明确在你的权限模型中的“ID”专栏中,我相信这是什么导致你的第二个问题。