当前位置: 首页 > 面试题库 >

Django迁移添加默认具有模型功能的字段

柴衡
2023-03-14
问题内容

我在Django模型中添加了一个新的,不可为空的字段,并尝试使用迁移来部署该更改。如何将用于现有模型的默认值设置为这些模型的某些功能而不是常量

例如,假设我以前有一个created_on字段,而我刚刚添加了一个updated_on字段,该字段的值最初要设置为模型的created_on。在迁移中我将如何做?

这就是我要开始的事情:

    migrations.AddField(
        model_name='series',
        name='updated_as',
        field=models.DateTimeField(default=????, auto_now=True),
        preserve_default=False,
    ),

问题答案:

我刚刚学习了如何通过一次迁移来做到这一点!

当运行makemigrationsdjango时,应要求你设置一个默认值。在这里定义所有可以使它满意的内容,最后将完成AddField你提到的迁移。

migrations.AddField(
    model_name='series',
    name='updated_as',
    field=models.DateTimeField(default=????, auto_now=True),
),

将此操作更改为3个操作:

  1. 最初使该字段可为空,因此将添加该列。
  2. 调用一个函数以根据需要填充该字段。
  3. 更改字段(带有AlterField)以使其不可为空(如上述,没有默认设置)。
    所以你最终得到类似的东西。
migrations.AddField(
    model_name='series',
    name='updated_as',
    field=models.DateTimeField(null=True, auto_now=True),
),
migrations.RunPython(set_my_defaults, reverse_func),
migrations.AlterField(
    model_name='series',
    name='updated_as',
    field=models.DateTimeField(auto_now=True),
),

你的函数定义为:

def set_my_defaults(apps, schema_editor):
    Series = apps.get_model('myapp', 'Series')
    for series in Series.objects.all().iterator():
        series.updated_as = datetime.now() + timedelta(days=series.some_other_field)
        series.save()

def reverse_func(apps, schema_editor):
    pass  # code for reverting migration, if any

除了,你知道,并不可怕。考虑使用F表达式和/或数据库函数来提高大型数据库的迁移性能。



 类似资料:
  • 问题内容: 假设我有一个模型: 目前,我正在使用默认的admin创建/编辑此类型的对象。如何从管理员中删除该字段,以使每个对象都无法使用值创建,而是将接收默认值? 问题答案: 设置为和为默认值。 http://docs.djangoproject.com/en/dev/ref/models/fields/#editable 另外,你的字段是不必要的。Django将自动添加它。

  • 所以我有一个这样的avro记录(称之为v1): 我想添加一个区分大小写的字段,默认值为false(称为v2)。我的第一种方法是: 根据模式演变,这是向后和向前兼容的,因为具有新模式的读取器读取用旧写入器模式编码的记录将能够填充此字段默认值和具有旧模式的读取器将能够读取用新写入器模式编码的记录,因为它只会忽略新添加的字段。 添加此字段的另一种方法是添加默认值为null的

  • 问题内容: 我有以下模型代码: 但是我希望,它将生成类似 这没有发生,当我运行它时会产生: 深入研究的代码并进行谷歌搜索没有给我任何好处,但是James Bennet的注释不被认为会影响生成,但是Django管理员需要它。即使是这样,我如何获得理想的效果? 我的版本是1.3.0最终版 问题答案: 请注意,该参数也可以采用可调用对象:https : //docs.djangoproject.com/

  • 问题内容: 我正在寻找将列添加到默认值为0的MySQL数据库的语法 参考 问题答案: 尝试这个: 从链接到的文档中: 要在页面下方查找搜索语法,请执行以下操作: column_definition子句对ADD和CHANGE使用与CREATE TABLE相同的语法。请参见第12.1.17节“创建表语法”。 并从链接页面: 注意那里的DEFAULT这个词。

  • 我不明白迁移中的选项会产生什么影响。 我可以看到数据库中的列是用默认值定义的,但是模型完全忽略了它。假设我有一个反映数据库中表的模型。我必须迁移才能创建books表: 当我创建一个新的模型实例时,我看到: 默认值被忽略,属性设置不正确。好的,我可以得到它,因为它是一个新对象,它不应该从数据库中获取默认值。但是如果我试图保存模型,比如: 在数据库的字段中保存0! 那么,迁移中的选项有什么意义呢? 顺

  • 本文向大家介绍django 模型字段设置默认值代码,包括了django 模型字段设置默认值代码的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 补充知识:django 设置默认值到SQL 环境:django 1.9.7 背景介绍 django migrate 生成表结构时,默认是不处理default(即字段的default 是在django 框架层面,没有到数据库