在使用django進行開發時,往往需要根據不同的需求對model進行更改。而這時候,python manage.py syncdb就不好使了。
目前有個很好的工具,是south,這個是專門用來更改model的。官方的文檔見http://south.readthedocs.org/en/latest/index.html。 里面有詳述的文檔,包括安裝和使用。
安裝很簡單easy_install 可以。
然后在你的setting.py 里面的app_install 里添加 'south'。
然后就可以使用命令 python manage.py schemamigration app --initial 這個是在你更改model之前做的初始化,有了這個版本后,你就可以隨便對app里的model進行更改了。更改結束后,運行python manage.py schemamigration app --auto然后使用python manage.py migrate app 就可以了。
problems:
1。如果添加一個字段,south需要你給這個字段添加一個默認直,以供之前已經存在的記錄作為默認值。但是,如果這個字段是unique的話,怎么設置默認值就都不行了。這個時候可能需要你直接對數據庫的表進行操作,刪除所有已經存在的記錄,然后設置默認值。另一個方法是,先不設定unique,添加字段,然后通過網站的后台更改已經存在的記錄的這個字段為不同值,然后再設定其為unique。后者是我的想法,沒有實踐過,提供一種思路。
2。有時可能需要對某些字段添加自己的解析規則。因為有些custom字段是Cannot freeze field 的,需要自己寫規則,
比如該類:在core.fields.thumbs.py 中的類 ImageWithThumbsField
from django.db.models import ImageField
class ImageWithThumbsField(ImageField):
def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, sizes=None, **kwargs): self.verbose_name=verbose_name self.name=name self.width_field=width_field self.height_field=height_field self.sizes = sizes super(ImageField, self).__init__(**kwargs)
而我在core.models.py中用到了這個類,我可以在core.models.py的開頭加入這個:
from south.modelsinspector import add_introspection_rules from core.fields.thumbs import ImageWithThumbsField add_introspection_rules( [ ( (ImageWithThumbsField, ), [], { "verbose_name": ["verbose_name", {"default": None}], "name": ["name", {"default": None}], "width_field": ["width_field", {"default": None}], "height_field": ["height_field", {"default": None}], "sizes": ["sizes", {"default": None}], }, ), ], ["^core.fields.ImageWithThumbsField",])
即可。更多的關於怎么自己寫rule,可以參考:
http://south.readthedocs.org/en/latest/customfields.html#extending-introspection
http://stackoverflow.com/questions/4715964/django-south-introspection-rule-doesnt-work
3如果在使用
./manage.py migrate myapp 的時候,如果出現某些表已經存在的錯誤(
django-south-table-already-exists
),可以這樣:
./manage.py migrate myapp --fake 參數
參數可以是上面schemamigration 命令返回的版本。
參考:
http://stackoverflow.com/questions/3090648/django-south-table-already-exists
http://stackoverflow.com/questions/10769644/django-south-adding-new-field-but-databaseerror-occurs-table-already-exists
目前我是遇到了這些錯誤,為大家總結一下。
能夠對model進行更改了,我們就可以進行的開源的項目中遨游啦。哈哈。