2011-02-24 75 views
2

對象,我有以下型號的Django刪除其中有一個字符串作爲主鍵

class Staff(models.Model): 
    username = models.OneToOneField(Person, primary_key=True) 
    room = models.CharField(blank=True, max_length=12) 

當我運行下面的代碼我得到的錯誤Truncated incorrect DOUBLE value: 'lacc1'

s = Staff.objects.get(pk = 'lacc1').delete() 

我認爲這有東西主鍵是一個字符串。有誰知道我可以如何解決這個問題。

它只在刪除。如果我只想使用get或filter來獲取對象,那麼它可以正常工作。數據庫中還有一個對象,其中包含pk lacc1,所以這不是問題。

編輯

Person類

class Person(models.Model): 
    username = models.CharField(primary_key=True, max_length=12) 
    title = models.CharField(max_length=25) 
    forenames = models.CharField(max_length=50) 
    surname = models.CharField(max_length=50) 
+0

你也可以發佈你的人員類嗎? – 2011-02-24 14:10:15

+0

完成。見上面 – John 2011-02-24 14:35:45

+0

是否從Django Admin工作中刪除? – Ron 2015-12-30 01:51:43

回答

3

你的主鍵不是字符串,它是一個int。

username = models.OneToOneField(Person, primary_key=True) 

username這裏就不CharFieldOneToOneField,這意味着相對於Person對象模型,這意味着含這個人實例在人錶行的id字段。

你可能想通過這種方式將其重命名:

person = models.OneToOneField(Person, primary_key=True) 

而且,假設你的Person對象有一個username屬性,你可以刪除你的員工是這樣的:

s = Staff.objects.get(person__username='lacc1').delete() 

但是,你必須知道這暗示person_id字段上的JOIN字段和Staff username字段上的過濾器,該字段可能未被編入索引。它會比你想象的要慢,但我懷疑它應該會有什麼麻煩。

+0

感謝您的答案,但它沒有奏效。當我嘗試調用delete()方法時,我沒有問題獲取對象。所以s = Staff.objects.get(person__username ='lacc1')會給我這個對象,但只要我調用對象的delete方法,我就會得到錯誤。 – John 2011-02-24 14:31:14

+0

刪除你的數據庫,重新運行syncdb,然後使用django admin創建你的對象。你不應該有一個主鍵爲'lacc1'的Staff對象。我無法猜測你是如何創建它的,但它與你的模型不符。 – 2011-02-24 14:59:39

相關問題