2014-01-22 47 views
2

我是django和PostgreSQL的新手,我有一個需要URL的模型,所以我使用了URLField,但其中一個嘗試保存的URL是長於200,其導致:django allways向PostgreSQL輸出一個模型字段「字符變化(200)」

django.db.utils.DataError: value too long for type character varying(200) 

我試圖改變max_legnth到255或URLFieldTextField但它總是轉換爲輸入字符改變(200)上的PostgreSQL。

我該如何解決這個問題?

不知道它是否重要,但我使用南方。

+0

你創建一個模式遷移和更新模型後遷移數據庫?否則,這些表格將保持與第一次創建時相同。 –

+0

其初始安裝。 – SnapDragon

+0

聽起來像你應該向Django人士報告一個錯誤。沒有理由設置字符串長度限制。 PostgreSQL不關心(或執行任何不同),所以他們應該只使用'text'或不受約束的'varchar'。 –

回答

2

正如Evan Porter指出的那樣,您需要創建新的模式遷移,然後進行遷移。

運行:

python manage.py schemamigration <APP_NAME> --auto 
python manage.py migrate 

應該解決的問題

+0

謝謝,這解決了這個問題。 – SnapDragon

0

你應該使用文本字段,如果你不介意的URL的長度的限制,與URLValidator

from django.core.validators import URLValidator 
field = models.TextField(validators=[URLValidator()]) 

這種行爲類似於網址欄。 這樣做後,你必須遷移你的模型使用南。

+0

沒有工作,仍然給我相同的類型。 – SnapDragon

+0

是否在更改後遷移?如果無法遷移,可以使用postgres alter table手動執行此操作。 –

0

對我來說,當我在我的模型中定義的__unicode__方法可能比200個符號,我打印出來的東西不再出現具體value too long for type character varying(200)嘗試在管理視圖中操作實例。

我的「修復」是取代這個:

def __unicode__(self): 
    return u'%s - %s - %s' % (self.photo.title, self.photo.desc, self.user.fb_name) 

有了這個:

def __unicode__(self): 
    title = None 
    desc = None 
    if self.photo.title: 
     title = self.photo.title[:50] 
    if self.photo.description: 
     desc = self.photo.description[:50] 
    return u'%s - %s - %s' % (title, desc, self.user.fb_name)