2013-04-17 65 views
1

我正在使用South來管理我的數據庫。似乎每次我改變一些未成年人的模式時,我最終都需要爲遷移做一堆體操。舉例來說,假設我有一個這樣的類:模式遷移和默認值

class Entry(models.Model): 

    title = models.CharField(max_length=80) 
    author = models.ForeignKey(User) 
    pubDate = models.DateTimeField() 
    tags = models.ManyToManyField(Tag) 
    text = models.TextField() 

而且具有Entry作爲一個ForeignKey另一個類:

class Comment(models.Model): 
    author = models.ForeignKey(User) 
    entry = models.ForeignKey(Entry) 
    pubDate = models.DateTimeField() 
    text = models.TextField() 

這是小事,但如果我是這樣做的簡單的東西更改名稱pubdate的在Entry到PUB_DATE,爲了只是這個名稱的改變正常執行模式的遷移,我會設置:

default=None, null=True 

兩個pubdate的在Entry並在Commententry場,否則我會嘗試運行遷移時出現以下情況例外:

The field 'Comment.entry' does not have a default specified, yet is NOT NULL. 

那樣我會回去,並採取了默認/空值。有沒有一種不那麼單調乏味的方式來做到這一點,還是在將它們提交給遷移之前,我只需要真正想出我的模型?在開始的階段,如果你沒有任何你關心的數據,建立和拆除數據庫更有意義嗎?如果是這樣,最簡單的方法是什麼?

回答

0

你需要創建一個遷移類,使用:

python manage.py datamigration yourapp change_name_to_pub_date 

並重寫向前和向後方法:

# -*- coding: utf-8 -*- 
import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 


class Migration(SchemaMigration): 
    def forwards(self, orm): 
     db.rename_column('yourapp_entry', 'pubDate', 'pub_date') 
     db.rename_column('yourapp_comment', 'pubDate', 'pub_date') 

    def backwards(self, orm): 
     db.rename_column('yourapp_entry', 'pub_date', 'pubDate') 
     db.rename_column('yourapp_comment', 'pub_date', 'pubDate') 

現在,運行:

python manage.py migrate yourapp