所以我在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、 请让我知道,如果有任何相关的细节,我忽略了包括。
1条答案
按热度按时间5cnsuln71#
当您运行迁移并从应用程序获取模型时,您不能使用自定义管理器或自定义保存或创建之类的功能。这个模型只有字段,仅此而已。如果您想实现您想要的,您应该像这样在迁移中添加您的逻辑: