django自定义迁移未执行

uinbv5nw  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(407)

所以我在django数据库表中添加了一个新的“status”字段。该字段需要一个默认值,因此我将其默认为“new”,但随后添加了一个自定义迁移文件,该文件对该表中的所有对象调用save()方法,因为我已重写save()以检查不同的表并从中提取正确的状态。但是,在运行此迁移之后,所有状态仍然设置为“new”,因此看起来似乎没有执行保存。我通过在运行迁移之后手动调用所有对象上的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),
    ]

所以我很清楚,我在迁移过程中犯了一些错误,但是我把它与django文档中看到的完全匹配,并且我还将它与这个stackoverflow答案进行了比较,我看不出我做错了什么。当我运行迁移时没有错误,但是我编写的自定义迁移几乎是瞬时运行的,这看起来很奇怪,因为当我手动保存时,保存所有300多个条目大约需要5秒钟。
有什么建议吗?
p、 请让我知道,如果有任何相关的细节,我忽略了包括。

5cnsuln7

5cnsuln71#

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


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

相关问题