在 Django 模型中填充现有字段
Posted
技术标签:
【中文标题】在 Django 模型中填充现有字段【英文标题】:Populating existing fields in Django model 【发布时间】:2018-04-01 21:42:46 【问题描述】:我有一个模型,其中一个字段定义为blank=True, null=True
。我将两者都更改为False
并编写了一个返回随机字符串的可调用函数。我将该函数设置为该字段的default=
,然后运行makemigrations
和migrate
,但我一直在我的表中看到空白字段。
这是预期的行为吗?如果是这样,我如何填充所有现有字段?
我正在使用 Django 1.10
【问题讨论】:
如果数据库中没有该字段的值,默认值是 ORM 层返回的值。应用 makemigrations 和 migrate 不应更改数据库中的值。如果您想更改字段值,可以查看此https://***.com/questions/29787853/django-migrations-add-field-with-default-as-function-of-model
。
@ArpitGoyal 这不是日期字段(也不是时间),所以auto_now
对我不起作用。
你可以做的事情是设置null=False
和blank=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 auto slug,例如 django admin 中的预填充字段