填充Django模型中的现有字段

填充Django模型中的现有字段

问题描述:

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

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

我使用Django 1.10

+0

默认v如果数据库中没有该字段的值,则ORM层返回。应用makemigrations并迁移不应该更改数据库中的值。如果你想改变字段值,你可以检查这个'https:// stackoverflow.com/questions/29787853/django-migrations-add-field-with-default-as-function-of-model'。 –

+0

@ArpitGoyal这不是一个DateField(也不是Time),所以'auto_now'不适合我。 – alexandernst

+0

你可以做的事情是设置'null = False'和'blank = False'并运行迁移,因此Django显示消息说你必须为这些空字段提供一个值,并且把'str('random_message')'并从壳中退出 –

直接应用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), 
    ] 

来源:Django Writing Migrations (populate_uuid_values.py)