2015-11-12 89 views
13

Python 3中,Django的1.8.5,Postgres的Django的遷移錯誤:列不存在

我有一個模型Sites已工作的罰款。我最近嘗試添加一個字段airport_code並遷移數據。

class Site(BaseModel): 

    objects = SiteManager() 

    name = models.CharField(max_length=200, unique=True) 
    domain = models.CharField(max_length=200, unique=True) 
    weather = models.CharField(max_length=10) 
    nearby_sites = models.ManyToManyField('self', symmetrical=False, blank=True) 
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True) 
    facebook = models.URLField(max_length=200) 
    twitter = models.URLField(max_length=200) 
    header_override = models.TextField(blank=True) 
    email_header_override = models.TextField(blank=True) 
    timely_site_tag_id = models.IntegerField() 
    timely_featured_tag_id = models.IntegerField() 
    timely_domain = models.CharField(max_length=255) 
    sitemap_public_id = models.CharField(max_length=255) 
    state = models.CharField(max_length=24) 
    airport_code = JSONField() 

然而,當我跑makemigrations我得到了一個錯誤:

django.db.utils.ProgrammingError: column sites_site.airport_code does not exist LINE 1: ..._site"."sitemap_public_id", "sites_site"."state", "sites_sit...

當然,這是沒有意義的,因爲當我試圖明顯的列不存在在遷移中創建它。

我已經看到很多關於堆棧溢出這個未得到解答的bug的問題,或者有一個解決方案來手動創建遷移文件,或者銷燬和重建數據庫。這不是一個好的解決方案。

回答

6

通過在settings.py中註釋掉INSTALLED_APPS中的django調試工具欄,解決了這個問題。我不知道爲什麼調試工具欄是罪魁禍首,但是在我評論它之後,我能夠運行makemigrationsmigrate而沒有問題。

希望這可以幫助某人,因爲我花了十二個小時試圖找出答案。

+4

這是發生對我來說,但不幸的是,我沒有使用Django的工具欄。不知道如何着手...... –

+0

Django Toolbar的評論也適用於我。我的數據庫是SQLite。 – JimInCO

6

運行makemigrations之後,請確保一步一步地通過堆棧跟蹤。

在我的情況下,我注意到它通過調用一個完全不同的應用程序中的forms.py中包含的表單來進行追蹤,該應用程序正好有一個對我試圖創建新遷移的模型的調用。

將Form類從forms.py移到views.py中修復了問題。

-1

將我的postgres數據庫遷移到不同的服務器後遇到此問題。不知何故,我搞砸了數據庫,無法用新的UserProfile類來更新我的模型。

我解決了創建現有架構初始遷移問題:

  1. 清空django_migrations表:delete from django_migrations;與命令DELETE FROM django_migrations WHERE app='my_app';
  2. 對於每一個應用程序,刪除其migrations文件夾:rm -rf <app>/migrations/
  3. 重置遷移對於「內置」應用程序:python manage.py migrate --fake
  4. 對於每個應用程序運行:python manage.py makemigrations <app>。照顧依賴關係(具有ForeignKey的模型應該在他們的父模型之後運行)。
  5. 最後:python manage.py migrate --fake-initial

明白了這裏:https://stackoverflow.com/a/29898483

PS我不知道,這是相關的問題的解決,但首先,我下降導致的在PostgreSQL的表錯誤並在模型中註釋掉UserProfile類。

sudo -su postgres 
psql databse_name 
DROP TABLE table_name; 

models.py:

#class UserProfile(models.Model): 
    #user = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True, primary_key=True, on_delete=models.CASCADE, related_name='user_profile') 
    #avatar = ThumbnailerImageField(upload_to='profile_images', blank=True) 
    #country = models.CharField(max_length = 128)