所以我添加了一个新的"状态"字段到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。如果我忽略了任何相关细节,请告诉我。
答案 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()