zoukankan      html  css  js  c++  java
  • django model改变后,同步数据库

    在使用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进行更改了,我们就可以进行的开源的项目中遨游啦。哈哈。
  • 相关阅读:
    1108递归
    1108JS函数
    1107数组例子
    1106JS循环
    1106JS数组
    1104JS语法
    1104JS循环
    PDO概念 分析 练习
    Jquery网页元素里面的操作以及JSON
    Jquery事件
  • 原文地址:https://www.cnblogs.com/frchen/p/5732490.html
Copyright © 2011-2022 走看看