填充Django模型中的现有字段
问题描述:
我有一个模型,其中一个字段定义为blank=True, null=True
。我将它们都更改为False
并编写了一个返回随机字符串的可调用函数。我将该函数设置为该字段的default=
,然后我运行了makemigrations
和migrate
,但我一直在我的表格中看到空白字段。填充Django模型中的现有字段
这是预期的行为?如果是这样,我如何填充所有现有的字段?
我使用Django 1.10
答
直接应用makemigrations并迁移与你的函数返回的默认值的字段不更新数据..
在你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_random(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),
]
默认v如果数据库中没有该字段的值,则ORM层返回。应用makemigrations并迁移不应该更改数据库中的值。如果你想改变字段值,你可以检查这个'https:// stackoverflow.com/questions/29787853/django-migrations-add-field-with-default-as-function-of-model'。 –
@ArpitGoyal这不是一个DateField(也不是Time),所以'auto_now'不适合我。 – alexandernst
你可以做的事情是设置'null = False'和'blank = False'并运行迁移,因此Django显示消息说你必须为这些空字段提供一个值,并且把'str('random_message')'并从壳中退出 –