南迁移 DateField 到 IntegerField
Posted
技术标签:
【中文标题】南迁移 DateField 到 IntegerField【英文标题】:South migrate DateField to IntegerField 【发布时间】:2014-04-20 06:20:18 【问题描述】:我想改变我的模型
class Source(models.Model):
release_date = models.DateField()
到
class Source(models.Model):
release_date = models.IntegerField()
不出所料,我收到了一个错误
django.db.utils.DataError: (1264, "Out of range value for column 'release_date' at row 1")
我真正想要的是,只在IntegerField
中保存年份,因为这就是我所需要的。有没有一种非常智能的方法来获取现有日期的年份字段并通过更改方法将其迁移到新的 IntegerField
def forwards(self, orm):
如果没有,我怎么能在不丢失所有数据、丢失存储日期的情况下更改字段类型,这将是我愿意付出的代价。
【问题讨论】:
【参考方案1】:一种选择是将任务拆分为 3 个迁移:
架构迁移:添加release_year
字段
data migration:从release_date
字段填充release_year
字段
架构迁移:删除release_date
字段并将release_year
重命名为release_date
south 会自动捕获架构迁移(使用 schemamigration --auto
),但您需要手动编写数据迁移,您的 forwards()
方法应如下所示:
def forwards(self, orm):
for source in orm.Source.objects.all():
source.release_year = source.release_date.year
source.save()
希望对您有所帮助。
【讨论】:
【参考方案2】:Alecxe 的回答对我很有帮助,截至 2019 年 5 月,这就是我在 Django 2.2 中实现此功能的方式:
0042_migration.py
# Generated by Django 2.2 on 2019-05-03 20:35
from django.db import migrations
def forwards(apps, schema_editor):
if schema_editor.connection.alias != 'default':
return
MyModel = apps.get_model('my_app', 'MyModel')
for object in MyModel.objects.all():
object.new_column = object.old_column
object.save()
class Migration(migrations.Migration):
dependencies = [
('my_app', '0041_previous_migration'),
]
operations = [
migrations.RunPython(forwards),
]
【讨论】:
以上是关于南迁移 DateField 到 IntegerField的主要内容,如果未能解决你的问题,请参考以下文章