我在Django中有模型设置如下.
class Pupil(models.Model):
forename = models.CharField(max_length=30)
surname = models.CharField(max_length=30)
dateofbirth = models.DateField()
year = models.IntegerField()
class_group = models.CharField(max_length=30)
email = models.EmailField(blank=True)
assignments = models.ManyToManyField('Assignment', verbose_name='related assignments')
def __unicode__(self):
return u'%s %s' % (self.forename, self.surname)
class Subject(models.Model):
name = models.CharField(max_length=30)
level = models.CharField(max_length=30)
teachers = models.ManyToManyField('Teacher', verbose_name='related teachers')
def __unicode__(self):
return self.name
class Teacher(models.Model):
forename = models.CharField(max_length=30)
surname = models.CharField(max_length=30)
email = models.EmailField(blank=True)
def __unicode__(self):
return u'%s %s' % (self.forename, self.surname)
class Assignment(models.Model):
assignment_name = models.CharField(max_length=30)
date_assigned = models.DateField()
date_submitted = …Run Code Online (Sandbox Code Playgroud) 运行单元测试时禁用Django South?在进行django单元测试时,如何避免运行所有南迁移?
所以我现在正在快速迭代一个django应用程序,我不断调整models.py.在一两天的编程和测试过程中,我生成了几十个迁移文件.有时候我真的撕开了架构并完全重新做了.这会导致迁移过程对默认值和空值等抱怨很多.如果可能的话,我只想抓住所有迁移的东西并重新开始迁移,因为我终于知道我在做什么了.到目前为止,我的方法如下:
__init__.py.DELETE FROM south_migrationhistory WHERE app_name='my_app';./manage.py makemigrations my_app- 这会0001_initial.py在我的迁移文件夹中生成一个文件../manage migrate my_app- 我希望这个命令重新构建我的所有表,但是它说:"没有要应用的迁移."是什么赋予了?
此外,south_migrationhistory数据库表现在仍然在播放,我已经转向南并已切换到Django 1.7?
谢谢.
django database-migration django-south django-1.7 django-migrations
我目前正在使用Django evolutions来管理我的产品的数据库演变.它并不完美,但我学会了忍受它的缺陷.例如,在移出新模式之前,我总是必须复制我的生产数据库进行测试,因为"evolve"命令不能总是演变一个在几次小迁移中改变的数据库(在测试中我做了A-> B-> C,但A-> C不会正确演变.)
南方会解决所有这些问题吗?是否值得学习新工具的努力?
我正试图从中迁移Django 1.6到Django 1.8.我South用于管理migrationsDjango 1.6.我已经成功创建了新的迁移文件python manage.py makemigrations.在运行时python manage.py migrate --fake-initial,我收到此错误
Traceback (most recent call last):
File "manage.py", line 39, in <module>
execute_from_command_line(sys.argv)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site- packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site- packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 225, in handle
emit_post_migrate_signal(created_models, self.verbosity, self.interactive, connection.alias)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/sql.py", line …Run Code Online (Sandbox Code Playgroud) 根据这里的文档:https: //docs.djangoproject.com/en/1.8/topics/migrations/它说:
migrate, which is responsible for applying migrations, as well as unapplying and listing their status.
Run Code Online (Sandbox Code Playgroud)
和
makemigrations, which is responsible for creating new migrations based on the changes you have made to your models.
Run Code Online (Sandbox Code Playgroud)
据我所知,我先做
makemigrations
Run Code Online (Sandbox Code Playgroud)
创建迁移文件,然后执行
migrate
Run Code Online (Sandbox Code Playgroud)
实际应用迁移?
请注意,我刚刚开始我的Django项目,并将我的应用程序添加到我的"installed_apps"列表中.在那之后,我做到了
python manage.py runserver
Run Code Online (Sandbox Code Playgroud)
它说
You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them.
Run Code Online (Sandbox Code Playgroud)
它没有提到任何关于运行makemigrations的内容.
我有一个处于BETA模式的应用程序.这个应用程序的模型有一些带有显式primary_key的类.因此Django使用字段并且不会自动创建id.
class Something(models.Model):
name = models.CharField(max_length=64, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
我认为这是一个坏主意(在django admin中保存对象时看到unicode错误),我想回去并为我的模型的每个类都有一个id.
class Something(models.Model):
name = models.CharField(max_length=64, db_index=True)
Run Code Online (Sandbox Code Playgroud)
我已经对我的模型进行了更改(通过db_index = True替换每个primary_key = True)并且我想要使用south迁移数据库.
遗憾的是,迁移失败并显示以下消息:
ValueError: You cannot add a null=False column without a default value.
我正在评估此问题的不同解决方法.有什么建议?
谢谢你的帮助
我有一个django项目,其中包含一个已包含数据的数据库表.我想更改字段名称而不会丢失该列中的任何数据.我最初的计划是简单地以一种实际上不会改变db表名称的方式更改模型字段名称(使用db_columncolumn参数):
原型号:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)
新型号:
class Foo(models.Model):
name = models.CharField(max_length=50, db_column='orig_name')
Run Code Online (Sandbox Code Playgroud)
但是,运行South's schemamigration --auto会生成一个删除原始列的迁移脚本orig_name,并添加一个新列name,这会产生删除该列中数据的不良副作用.(我也很困惑为什么South想要更改db中列的名称,因为我对db_column的理解是它允许更改模型字段名而不更改数据库表列的名称).
如果我无法在不更改db字段的情况下更改模型字段,我想我可以做更直接的名称更改,如下所示:
原型号:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)
新型号:
class Foo(models.Model):
name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)
无论我最终使用哪种策略(我更喜欢第一种,但会发现第二种可接受),我主要担心的是确保我不会丢失该列中已有的数据.
这需要一个多步骤的过程吗?(例如1.添加列,2.将数据从旧列迁移到新列,以及3.删除原始列)或者我可以使用类似的方式更改迁移脚本db.alter_column吗?
更改列名称时保留该列中数据的最佳方法是什么?
运行后:
$ ./manage.py migrate 我收到以下错误:
-bash: ./manage.py: Permission denied
Run Code Online (Sandbox Code Playgroud)
尝试在DB中进行更改后运行迁移.任何建议都会非常感激.
我不想破坏我网站上的所有用户.但我想利用Django 1.5的自定义可插拔用户模型.这是我的新用户模型:
class SiteUser(AbstractUser):
site = models.ForeignKey(Site, null=True)
Run Code Online (Sandbox Code Playgroud)
在新的安装上我的新模型都可以使用(我还有其他代码,还有一个很好的理由 - 所有这些都与此无关).但是,如果我把它放在我的实时网站上并同步和迁移,我将丢失所有用户,或者至少他们将处于与为我的新模型创建的新表不同的孤立表中.
我对南方很熟悉,但基于这篇文章和我的一些试验,似乎它的数据迁移目前还不适合这种特定的迁移.所以我正在寻找一些方法来让South为此工作或者为我的每个服务器(Postgres 9.2)运行的一些非南迁移(原始SQL,dumpdata/loaddata或其他)迁移用户一旦创建了新表,而旧的auth.User表仍在数据库中.
django-south ×10
django ×9
python ×2
customcolumn ×1
django-1.5 ×1
django-1.7 ×1
django-1.8 ×1
migration ×1
postgresql ×1
unit-testing ×1