2009-11-18 81 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」專欄中,我相信這是什麼導致你的第二個問題。