【转载】解决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 版权声明:本文为博主原创文章,未经博主允许不得转载. 如上图, 如果文件修改 ...
随机推荐
- Caffe学习--Blob分析
Caffe_blob 1.基本数据结构 Blob为模板类,可以理解为四维数组,n * c * h * w的结构,Layer内为blob输入data和diff,Layer间的blob为学习的参数.内部封 ...
- servlet中Session的用法
## (1)什么是Session? 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象). 当浏览器第一次访问服务器时,服务器会创建session对象(该 ...
- 基本数据类型(list、tuple)
1.列表 1.1 定义 li=[1,2,3] 每个元素逗号隔开 list("abc") 迭代 列表是一个容器 => 任意类型 列表是有序的 => 索引 切片 步长 列表 ...
- Webpack的作用(一个基础的打包编译工具在做什么?)
结论: 转换ES6语法成ES5 处理模块加载依赖 生成一个可以在浏览器加载执行的 js 文件 第一个问题,转换语法,其实我们可以通过babel来做.核心步骤也就是: 通过babylon生成AST 通过 ...
- yum-config-manager --add-repo=
[root@server0 yum.repos.d]# yum-config-manager --add-repo=ftp://192.168.31.121/centos7u4Loaded plugi ...
- [Java] 使用 Apache的 Commons-net库 实现FTP操作
因为最近工作中需要用到FTP操作,而手上又没有现成的FTP代码.就去网上找了一下,发现大家都使用Apache的 Commons-net库中的FTPClient. 但是,感觉用起来不太方便.又在网上找到 ...
- HTTP——学习笔记(6)https
HTTP+加密+认证+完整性保护=HTTPS HTTP是一种新协议吗?: 不是,HTTPS只是HTTP通信接口部分用SSL和TLS协议代替而已 HTTP中,身处应用层的HTTP直接和TCP通信.而在使 ...
- 题解 P3200 【[HNOI2009]有趣的数列】
说起来这是今天第三道卡特兰数了... 楼上的几篇题解好像都是直接看出这是卡特兰数,所以我就写一下为什么这道题可以用卡特兰数吧. 考察这样相邻的两项:\(a_{2i-1}\)与\(a_{2i}\),根据 ...
- 【BZOJ 1503】[NOI2004]郁闷的出纳员
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 因为所有人工资同时递减. 所以可以设置一个变化值delta. 然后每个人的初始值为k 则把k-delta加入伸展树中. 会发现del ...
- 2015 Multi-University Training Contest 2 Friends
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...