2017-10-20 6 views
0

モデルがあり、そのフィールドの1つがblank=True, null=Trueと定義されています。私はFalseに変更し、ランダムな文字列を返す呼び出し可能な関数を書いた。私はそのフィールドのdefault=としてその機能を設定してから、makemigrationsmigrateを実行しましたが、私のテーブルに空白のフィールドが表示され続けます。Djangoモデルに既存のフィールドを設定する

この動作は期待されていますか?もしそうなら、私はどのようにして既存のフィールドをすべて埋めることができますか?あなたのMigrationのクラスでは、私は

+0

デフォルトのV alueは、そのフィールドのデータベースに値がない場合、ORMレイヤが返す値です。 makemigrationsとmigrateを適用しても、データベース内の値は変更しないでください。フィールド値を変更する場合は、この 'https:// stackoverflow.com/questions/29787853/django-migrations-add-field-with-default-with-model-of-model'をチェックすることができます。 –

+0

@ArpitGoyalこれはDateField(またはTime)ではないので、 'auto_now'は私のためには機能しません。 – alexandernst

+0

あなたができることは、 'null = False'と' blank = False'に設定してマイグレーションを実行するので、Djangoはそれらの空のフィールドに値を指定しなければならないというメッセージを表示し、 'str( 'random_message')'シェルから出る –

答えて

1

直接適用makemigrationsジャンゴ1.10を使用して、関数から返されるデフォルト値を持つフィールドのデータを更新しない移行しています

..

あなたが関数を書くことができますそれは(あなたのデータベースの値を更新する)ので、実現

# -*- 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)

関連する問題