南方为什么不识别Python模型中默认字段值的变化?例如,使用以南迁移的现有模型:
class MyFamily(models.Model):
family_size = models.IntegerField(verbose_name="What is your family size?", default=2)
Run Code Online (Sandbox Code Playgroud)
现在,我想将默认值从2更改为4.但是,在模块化模块时,South报告:
python manage.py schemamigration family --auto change_default_from_two_to_four_for_size
Running migrations for family:
- Nothing to migrate.
- Loading initial data for family.
Run Code Online (Sandbox Code Playgroud)
我可以手动更新初始迁移,并使用SQL直接更新字段,但这很痛苦.是否有一个我发现的南方命令识别默认值的变化?
谢谢!
我有一个Django项目,最初是作为遗留数据库的导入.因此,存在具有复合主键的模型.只要我只使用遗留数据,这就有效,但现在我想添加新数据,我创建的表单告诉我我正在尝试插入重复数据,大概是因为它只是查看其中一个字段作为首要的关键.
现在我想更改模型以使用自动增量主键,就像Django会自动添加一样.我尝试从字段中删除主键属性,并将它们放在Meta内部类中的unique_together中.当我schemamigration和South一起跑时,它想id按预期添加一个字段,但它要求一个默认值.
如何指定South应以某种方式为自动增量字段分配唯一键?(即将序列[1 ... n]分配给记录的某些任意顺序)
如果这不可能有另一种方法来完成同样的事情,最好使用Django和South?
背景 :-
我正在使用Django 1.3.我们使用South作为数据库迁移和Git SCM的模块.
问题:-
处理迁移的正确方法是什么形成的文件夹?
主要问题是我在开发机器中对数据库模式进行了更改,当我将其上传到生产服务器时,我必须迁移现有模式.虽然这样做,但迁移文件总是存在一些问题.
我应该只将迁移文件夹添加到gitignore吗?或者有更好的方法去做吗?
我有一个关于如何在团队中工作时使用Django-South的简短问题.
如果两个人同时在对同一文件的更改中创建迁移文件会发生什么?
例如,A和B正在使用相同的Django应用程序.他们在不同的分支中工作,并且都在迁移005.现在,A和B都修改了apple/models.py并使用startmigration创建了迁移文件.它们都处于迁移006但是具有完全不同的迁移文件006.我猜当它们合并它们的分支时,可能会有一些与South的错误.
有没有解决此冲突的解决方法?或南方足够智能自己解决它?
我正在尝试使用现有数据转发模型.该模型有一个新的字段,其约束唯一= True和null = False.当我做
./manage.py schemamigration myapp --auto
Run Code Online (Sandbox Code Playgroud)
South让我通过询问为新字段指定默认值:
Specify a one-off value to use for existing columns now
Run Code Online (Sandbox Code Playgroud)
通常我将其设置为None,但由于此字段必须是唯一的,我想知道是否可以通过以下方式传递South的唯一值:
>>> import uuid; uuid.uuid1().hex[0:35]
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误信息
! Invalid input: invalid syntax
Run Code Online (Sandbox Code Playgroud)
在通过命令行迁移时是否可以传递South随机唯一默认值?
谢谢.
背景:在我的项目中添加djangoratings之后,我尝试了运行
django-admin.py schemamigration djangoratings --initial
--settings=myapp.settings.local
Run Code Online (Sandbox Code Playgroud)
这导致了schemamigration的未知命令错误.我试图通过将我的项目目录添加到PYTHONPATH来解决此错误(我使用的是virtualenv和virtualenvwrapper).这解决了schemamigration的未知命令错误,但是我想我在项目目录上面为PYTHONPATH指定了一个目录,当为djangoratings运行初始迁移时,它抱怨与whoosh有关(我在我的项目中使用) .我更改了PYTHONPATH目录并尝试运行
django-admin.py schemamigration djangoratings --initial
--settings=myapp.settings.local
Run Code Online (Sandbox Code Playgroud)
再次.然后我运行了migrate命令.这是我收到错误时:
django.db.utils.DatabaseError: relation "djangoratings_vote" already exists
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方式一直迁移:
django-admin.py migrate djangoratings zero --settings=myapp.settings.local
Running migrations for djangoratings:
- Migrating backwards to zero state.
< djangoratings:0006_add_cookies
< djangoratings:0005_add_exclusions
< djangoratings:0004_rethink_recommendations
< djangoratings:0003_add_correlations
< djangoratings:0002_add_mean_and_stddev
< djangoratings:0001_initial
Run Code Online (Sandbox Code Playgroud)
然后再次运行 - 初始化,但执行migrate命令后发生了同样的错误.
我查看了数据库中的表列表,并没有看到任何djangoratings_vote.
我目前的djangoratings迁移清单如下:
0001_initial.py 0006_add_cookies.py
0001_initial.pyc 0006_add_cookies.pyc
0002_add_mean_and_stddev.py 0007_initial.py
0002_add_mean_and_stddev.pyc 0007_initial.pyc
0003_add_correlations.py 0008_initial.py
0003_add_correlations.pyc 0008_initial.pyc
0004_rethink_recommendations.py 0009_initial.py
0004_rethink_recommendations.pyc 0009_initial.pyc
0005_add_exclusions.py __init__.py
0005_add_exclusions.pyc __init__.pyc
Run Code Online (Sandbox Code Playgroud)
我如何解决关系"djangoratings_vote"已经存在的错误?最好用南?
我正在使用一个使用South迁移数据库的操作系统项目.我正在从头开始构建一个新的数据库,我想确保设置South以便将来轻松更新数据库.
看来这个过程应该是:
但是,当我尝试迁移数据库时,早期迁移之一(迁移0004并且转到0009)会引发异常:
ValueError: You cannot add a null=False column without a default value.
Run Code Online (Sandbox Code Playgroud)
我不明白如何向迁移0004添加默认值,因此不会抛出此异常.
由于数据库为空,因此无需运行迁移.
但是, south_migrationhistory必须包含所有迁移的列表以及何时应用它们.
我试图破解它,只是手动将迁移0009添加到数据库,但这引发了另一个错误,因为尚未运行中间迁移.我还尝试向数据库添加一个字段,以查看我是否能够找出add_column的语法,其默认值为0.该格式与这些较旧的迁移完全不同.
以下是add_column语法的2个不同版本:
#0004 syntax:
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'])
#0009 syntax:
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
Run Code Online (Sandbox Code Playgroud)
所以,我猜测在创建0004和今天之间南方代码发生了变化.
有没有办法用syncdb构建数据库,然后以某种方式更新south_migrationhistory而不运行manage.py migrate?
如果您有一个具有南迁移的现有应用程序,您将如何从头开始构建新数据库?
我无法迁移,因为整数字段没有默认设置.如何在较早的迁移中设置默认值?该领域甚至不再存在.
尝试语法:
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0})
#throws ValueError: You cannot add a null=False column without a default value.
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
#throws AttributeError: Migration instance has no attribute 'gf'
Run Code Online (Sandbox Code Playgroud)
我正在使用South-0.7.2-py2.7.egg
我在我的Django项目中使用South进行迁移.当我在我的项目上运行Pylint时,我从迁移文件中得到了一堆错误.如何从Pylint中排除迁移文件?
我在Windows系统上,所以我不能在Pylint选项中使用文件名排除.我试图添加# pylint: disable-msg-cat=WCREFI到每个迁移文件的顶部.它似乎非常kludgy,似乎是最后的手段,但这个记录的指令不起作用,我得到错误[E] Unrecognized file option 'disable-msg-cat'.
我最近开始深入挖掘南方文档并发现它有两种不同类型的迁移:
由于我的无知,我总是使用schemamigrations来处理所有事情.换句话说,即使我有一些真正的"数据迁移",我也只是使用South的模式迁移来转换数据(没有明显的后果).
当我阅读文档时,我没有看到这种方法的错误.有没有人知道两次迁移之间的根本区别以及我坚持使用schemamigrations可能会遗漏的内容?
我有两个类,其中一个是另一个类的后代,我想让它们成为同一基类的同类兄弟类.
之前:
from django.db import models
class A(models.Model):
name = models.CharField(max_length=10)
class B(models.Model):
title = models.CharField(max_length=10)
Run Code Online (Sandbox Code Playgroud)
后:
from django.db import models
class Base(models.Model):
name = models.CharField(max_length=10)
class A(Base):
pass
class B(Base):
title = models.CharField(max_length=10)
Run Code Online (Sandbox Code Playgroud)
当我生成模式迁移时,这是输出,包括我对问题的回答:
+ Added model basetest.Base
? The field 'B.a_ptr' does not have a default specified, yet is NOT NULL.
? Since you are removing this field, you MUST specify a default
? value to use for existing rows. Would you like to:
? 1. Quit now, …Run Code Online (Sandbox Code Playgroud)