在 Django 模型中填充现有字段

Posted

技术标签:

【中文标题】在 Django 模型中填充现有字段【英文标题】:Populating existing fields in Django model 【发布时间】:2018-04-01 21:42:46 【问题描述】:

我有一个模型,其中一个字段定义为blank=True, null=True。我将两者都更改为False 并编写了一个返回随机字符串的可调用函数。我将该函数设置为该字段的default=,然后运行makemigrationsmigrate,但我一直在我的表中看到空白字段。

这是预期的行为吗?如果是这样,我如何填充所有现有字段?

我正在使用 Django 1.10

【问题讨论】:

如果数据库中没有该字段的值,默认值是 ORM 层返回的值。应用 makemigrations 和 migrate 不应更改数据库中的值。如果您想更改字段值,可以查看此https://***.com/questions/29787853/django-migrations-add-field-with-default-as-function-of-model @ArpitGoyal 这不是日期字段(也不是时间),所以auto_now 对我不起作用。 你可以做的事情是设置null=Falseblank=False并运行迁移,这样Django会显示一条消息,说你必须为那些空字段提供一个值,然后你输入str('random_message')并退出从外壳 【参考方案1】:

直接应用 makemigrations 和 migrate 不会使用您的函数返回的默认值更新字段的数据..

在您的 Migration 类中,您可以编写一个实现此目的的函数(更新数据库中的值)

# -*- coding: utf-8 -*-
# Generated by Django A.B on YYYY-MM-DD HH:MM
from __future__ import unicode_literals

from django.db import migrations
import uuid

def gen_uuid(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    for row in MyModel.objects.all():
        row.uuid = uuid.uuid4()
        row.save(update_fields=['uuid'])

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0004_add_uuid_field'),
    ]

    operations = [
        # omit reverse_code=... if you don't want the migration to be reversible.
        migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
    ]

来源:Django Writing Migrations (populate_uuid_values.py)

【讨论】:

get_random 应该是gen_uuid

以上是关于在 Django 模型中填充现有字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中更改模型时填充数据库字段

模型形式中的 django auto slug,例如 django admin 中的预填充字段

Django:从服务器上的现有文件手动创建模型中的图像字段

Django Rest Framework:POST时自动填充模型的字段?

Django:使用forms.py更新现有模型中的单个字段

向现有 django 模型添加新的唯一字段时的最佳实践