【转载】解决django models文件修改后的数据库同步问题——south模块
转载链接:https://www.cnblogs.com/frchen/p/5732490.html
在使用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进行更改了,我们就可以进行的开源的项目中遨游啦。哈哈。
【转载】解决django models文件修改后的数据库同步问题——south模块的更多相关文章
- django models.py增加后MySQL数据库中并没有生成相应的表
根据教程到添加并保存quest的时候报错了 1.models.py里面的命名没有错 2.查看mysite->settiongs下的INSTALLED_APPS设置正确 3.使用python ma ...
- Eclipse中js文件修改后浏览器不能及时更新的解决办法
项目中js文件修改后浏览器不能及时更新的解决办法 转载:http://www.codeweblog.com/%E9%A1%B9%E7%9B%AE%E4%B8%ADjs%E6%96%87%E4%BB%B ...
- win7 Host文件修改后无效的解决办法
win7 Host文件修改后无效的解决办法 正常情况下hosts文件随时修改随时生效,如果出现修改后不生效的情况,首先确定文件是ascii编码,以windows格式为换行符,然后依次采用如下方法 1 ...
- eclipse 使用tomcat运行JavaWeb项目,文件修改后为何不用重启tomcat? (运行web项目的4种方式)探究
1.情景说明 在eclipse中,为什么Java文件修改后,重启tomcat class文件才能生效? 为什么jsp修改后,不需重启tomcat就能立即生效? 为什么静 ...
- 解决django配合nginx部署后admin样式丢失
解决django配合nginx部署后admin样式丢失 1. 在项目的settings.py文件里添加以下内容: STATIC_URL = '/static/' STATICFILES_DIRS = ...
- 让/etc/profile文件修改后立即生效
方法1: 让/etc/profile文件修改后立即生效 ,可以使用如下命令: # . /etc/profile 注意: . 和 /etc/profile 有空格 方法2: 让/etc/profile ...
- 让/etc/profile文件修改后立即生效(转)
方法1:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# . /etc/profile注意: . 和 /etc/profile 有空格方法2:让/etc/profile文件修改后 ...
- /profile文件修改后立即生效
修改profile etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的.要修改profile,需要取得root权限,(使用gedit编辑) $sudo gedit /et ...
- [转] eclipse SVN中文件修改后图标不变黑星解决
原文地址:http://blog.csdn.net/luwei42768/article/details/39225641 版权声明:本文为博主原创文章,未经博主允许不得转载. 如上图, 如果文件修改 ...
随机推荐
- HD-ACM算法专攻系列(11)——Exponentiation
问题描述: 源码: 考察对大数的计算,需要注意去除前导0与后导0. import java.math.BigDecimal; import java.util.*; public class Main ...
- Android ViewPager系列之ViewPager一屏显示多个子页面
ViewPager一屏显示多个子页面,常见的有两种形式: 1.当前展示的页面右侧显示一部分下个页面的内容 2.当前页面居中,左右两边分别显示上一个页面.下一个页面 第 1 种表现形式的实现代码 其实这 ...
- JavaScript学习——使用JS完成省市二级联动
1.我们希望在注册页面中添加一个字段(籍贯),当用户选择一个具体的省份,在后面的下拉列表中动态加载该省份下所有的城市.显示的效果如下: 2.步骤分析: 第一步:确定事件(onchange)并为其绑定一 ...
- JavaScript学习——BOM对象
1.BOM 对象:浏览器对象模型(操作与浏览器相关的内容) 2.Window 对象 Window 对象表示浏览器中打开的窗口 setInterval():它有一个返回值,主要是提供给 clearInt ...
- Git常见问题 资料汇总
来源https://blog.csdn.net/albb_/article/details/80420468
- h5 input失去焦点软键盘把页面顶起
var broswer=localStorage.getItem('temp') //浏览器环境 var u = navigator.userAgent var isiOS = !!u.match(/ ...
- 安装lnmp前请先运行screen
当通过putty或者SecureCRT安装lnmp时, 网络突然掉线或者不小心putty被关掉等等原因, 造成lnmp安装过程被中断怎么办? 其实防止这种现象很简单, 只要在安装lnmp前执行scre ...
- scrapy框架学习
一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网 ...
- LCT复习
LCT,虚实链剖分.支持连边和断边操作.Tarjan制造. [HNOI2010]弹飞绵羊 当然这题分块可以做,常数小,但是LCT更无脑. 建立一个虚拟的弹飞节点\(n+1\),初始化时对于一个点假如再 ...
- git 源码安装后报错/usr/bin/git: No such file or directory
现象 今天源码安装一个git后,执行git命令后报如下错误: $ git --version -bash: /usr/bin/git: No such file or directory 分析过程 开 ...