Django自定义迁移不执行

时间:2018-05-24 16:26:06

标签: python mysql django django-migrations

所以我添加了一个新的"状态"字段到django数据库表。这个字段需要一个默认值,所以我将它默认为" New",然后我添加了一个自定义迁移文件,在该表中的所有对象上调用save()方法,因为我有保存()重写以检查不同的表并从中拉出正确的状态。但是,在运行此迁移后,所有状态仍设置为" New",因此看起来保存并未执行。我通过在运行迁移后手动调用所有对象上的保存来测试这个,并且状态按预期更新。

这是models.py中的表格模型:

class SOS(models.Model):
    number = models.CharField(max_length=20, unique=True)
    ...
    # the default="New" portion is missing here because I have a migration to remove it after the custom migration (shown below) that saves the models
    status = models.CharField(max_length=20)

    def save(self, *args, **kwargs):
        self.status = self.history_set.get(version=self.latest_version).status if self.history_set.count() != 0 else "New"
        super(SOS, self).save(*args, **kwargs)

以下是迁移:

# Generated by Django 2.0.5 on 2018-05-23 13:50
from django.db import migrations, models

def set_status(apps, schema_editor):
    SOS = apps.get_model('sos', 'SOS')
    for sos in SOS.objects.all():
        sos.save()

class Migration(migrations.Migration):

    dependencies = [
        ('sos', '0033_auto_20180523_0950'),
    ]

    operations = [
        migrations.RunPython(set_status),
    ]

所以我似乎很清楚我在迁移时遇到了什么问题,但我将其与我在Django Documentation中看到的完全匹配,并将其与this进行了比较StackOverflow回答,我无法看到我做错了什么。我运行迁移时没有错误,但是我编写的自定义版本确实运行很多,这看起来很奇怪,因为当我手动保存时,保存所有300多个条目大约需要5秒钟。

有什么建议吗?

P.S。如果我忽略了任何相关细节,请告诉我。

1 个答案:

答案 0 :(得分:1)

当您运行迁移并从应用获取模型时,您无法使用自定义管理器或自定义保存或创建或类似的东西。这个模型只有字段和所有字段。如果您想实现您想要的目标,您应该将逻辑添加到这样的迁移中:

# comment to be more than 6 chars...
def set_status(apps, schema_editor):
    SOS = apps.get_model('sos', 'SOS')
    for sos in SOS.objects.all():
        if sos.history_set.exists():
            sos.status = sos.history_set.get(version=sos.latest_version).status 
        else:
            sos.status =  "New"
        sos.save()