Python Django自定义迁移未执行

Python Django自定义迁移未执行,python,mysql,django,django-migrations,Python,Mysql,Django,Django Migrations,因此,我在django数据库表中添加了一个新的状态字段。该字段需要一个默认值,因此我将其默认为New,但随后添加了一个自定义迁移文件,该文件对该表中的所有对象调用save方法,因为我已覆盖save以检查不同的表并从中提取正确的状态。但是,在运行此迁移之后,所有状态仍然设置为“新建”,因此看起来似乎没有执行保存。我通过在运行迁移后手动调用所有对象上的save来测试这一点,并且状态会按预期更新 以下是models.py中的表格模型: class SOS(models.Model): numb

因此,我在django数据库表中添加了一个新的状态字段。该字段需要一个默认值,因此我将其默认为New,但随后添加了一个自定义迁移文件,该文件对该表中的所有对象调用save方法,因为我已覆盖save以检查不同的表并从中提取正确的状态。但是,在运行此迁移之后,所有状态仍然设置为“新建”,因此看起来似乎没有执行保存。我通过在运行迁移后手动调用所有对象上的save来测试这一点,并且状态会按预期更新

以下是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),
    ]
所以我很清楚我在迁移过程中犯了一些错误,但我将它与我在中看到的完全匹配,并将它与StackOverflow答案进行了比较,我看不出我做错了什么。运行迁移时没有错误,但我编写的自定义迁移几乎是瞬间运行的,这似乎很奇怪,因为当我手动保存时,保存所有300多个条目大约需要5秒钟

有什么建议吗


另外,如果有我忽略的相关细节,请告诉我。

当您运行迁移并从应用程序获取模型时,您不能使用自定义管理器或自定义保存或创建之类的功能。这个模型只有字段,仅此而已。如果您想实现您想要的,您应该将您的逻辑添加到迁移中,如下所示:

# 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()

只需删除对自我的引用,但在其他方面是完美的!现在我觉得自己很傻,因为我不想尝试。。。谢谢此外,最好使用exists而不是count==0Gotcha。我将更新我的保存以使用它。非常感谢。