python - Django 数据迁移在运行 manage.py test 时失败,但在运行 manage.py migrate 时失败

标签 python django unit-testing django-testing django-migrations

我有一个看起来像这样的 Django 1.7 迁移:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations

def units_to_m2m(apps, schema_editor):
    Interval = apps.get_model("myapp", "Interval")
    IntervalUnit = apps.get_model("myapp", "IntervalUnit")

    for interval in Interval.objects.all():
        IntervalUnit(
            interval=interval,
            unit=interval.unit,
            base_date=interval.base_date
        ).save()

class Migration(migrations.Migration):

    dependencies = [
        ('otherapp', '0007_auto_20150310_1400'),
        ('myapp', '0009_auto_20150316_1608'),
    ]

    operations = [
        migrations.CreateModel(
            name='IntervalUnit',
            # ...
        ),
        # ...
        migrations.AddField(
            model_name='interval',
            name='units',
            field=models.ManyToManyField(to='otherapp.Unit', through='myapp.IntervalUnit'),
            preserve_default=True,
        ),
        migrations.RunPython(units_to_m2m),
        migrations.RemoveField(
            model_name='interval',
            name='unit',
        ),
        migrations.RemoveField(
            model_name='interval',
            name='base_date',
        ),
    ]

当我运行 manage.py migrate 时,它迁移得很好。但是,当我运行 manage.py test 时,它会尝试创建测试数据库,然后在迁移过程中失败并出现以下错误:

Traceback (most recent call last):
...
  File "/home/adam/myproject/myapp/migrations/0010_auto_20150317_1516.py", line 10, in units_to_m2m
    for interval in Interval.objects.all():
...
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_interval.base_date' in 'field list'")

当我之后连接到测试数据库时(它不会删除它),迁移运行后数据库结构看起来与您预期的一样,即使它在中途崩溃了。这是怎么回事?

编辑:我尝试将迁移分成三个单独的迁移,一个包含 RunPython 之前的所有内容,一个包含 RunPython 独立的,一个包含所有之后的东西;它仍然在做同样的事情。

最佳答案

这有点奇怪,我们不知道为什么会这样,但我们将路由器中的 allow_migrate 签名更改为以下内容:

def allow_migrate(self, db, app_label, **hints):
    """
    Make sure the mydb db does not allow migrations
    """
    if db == 'mydb':
        return False

    return True

然后这个错误神秘地消失了。请注意,此签名与 1.8 文档中的内容不匹配(我们使用的是 1.8.2)allow_migrate(db, app_label, model_name=None, **hints),如下所示:https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#allow_migrate

但希望这对您有所帮助?

关于python - Django 数据迁移在运行 manage.py test 时失败,但在运行 manage.py migrate 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29138113/

相关文章:

python - Django 中的 "Manager"是什么?

django - 在 Django 中使用 TemplateView 和 ListView 有什么区别?

Python - 类似 PHP 的动态数组

c# - 我如何将 Controller 与过滤器一起进行单元测试(带有 autofac 的 ASP.NET MVC)

python - 模糊逻辑: How to detect when a 404 is not actually an error page?

python - 为 virtualenv 中安装的所有包获取 pip install 命令

python - 使用 django orm 生成更新查询

python - 导入错误 : No module named books. 型号

python - Django 网站有文件夹布局结构吗?

用于 mysql 的 python 模拟