Django迁移-通过应对现有字段填充空白字段

如何解决Django迁移-通过应对现有字段填充空白字段

在更改模型后进行迁移时遇到问题。我已经将exisitnig DateField( lectures_begginning )从null=true更改为null=false。现在,我必须填充旧条目。幸运的是,我有一个现有的DateField( semester_begginning ),该字段始终设置为null=false。通常这两个时间相差4-5天,因此我可以复制 semester_beggining

class Semester(models.Model):

    lectures_beginning = models.DateField(
        null=False,verbose_name='Class start day')
    semester_beginning = models.DateField(
        null=False,verbose_name='Semester start day')

如何更改迁移,以便仅在后者为NULL时将 semester_beginning 的值复制到 lectures_beginning

from django.db import migrations,models

class Migration(migrations.Migration):

    dependencies = [
        ('courses','0034_auto_20201106_2039'),]

    operations = [
        migrations.AlterField(
            model_name='semester',name='lectures_beginning',field=models.DateField(verbose_name='Dzień rozpoczęcia zajęć'),),]

解决方法

您应该使用make_migration创建一个空迁移。然后将RunPython操作添加到新迁移的operations列表中。

以下是一个示例(来自Django documentation):

from django.db import migrations

def combine_names(apps,schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Person = apps.get_model('yourappname','Person')
    for person in Person.objects.all():
        person.name = '%s %s' % (person.first_name,person.last_name)
        person.save()

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname','0001_initial'),]

    operations = [
        migrations.RunPython(combine_names),]

如注释中所述,您必须使用apps来检索Model实例,因为您需要一个与迁移历史记录中特定点的数据库架构兼容的版本。

在您的情况下,您可以查询Semester为空的所有lectures_beginning对象。然后迭代结果列表中的对象,复制该对象的字段,然后保存该对象。 (我认为没有一种聪明的方法可以避免编写一些python代码。)

请注意,此数据迁移需要在使用AlterField进行迁移之前进行。我建议保持将架构和数据迁移操作放在单独的迁移中。 (我不知道如果您尝试将它们结合起来是否可行。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?