【问题标题】:South migrate DateField to IntegerField南迁移 DateField 到 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):

如果没有,我怎么能在不丢失所有数据、丢失存储日期的情况下更改字段类型,这将是我愿意付出的代价。

【问题讨论】:

    标签: django integer django-south database-migration


    【解决方案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),
          ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-19
        • 2021-01-09
        • 1970-01-01
        • 2011-04-03
        • 2013-02-02
        • 2012-06-05
        • 2014-12-21
        相关资源
        最近更新 更多