2017-10-20 3 views
0

모델이 있고 필드 중 하나가 blank=True, null=True으로 정의됩니다. 모두 False으로 변경하고 임의 문자열을 반환하는 호출 가능 함수를 작성했습니다. 해당 필드의 default=이라는 함수를 설정 한 다음 makemigrationsmigrate을 실행했지만 내 테이블에 빈 필드가 계속 표시됩니다.장고 모델의 기존 필드 채우기

예상되는 동작입니까? 그렇다면 기존 필드를 어떻게 채울 수 있습니까? 당신의 Migration 클래스에서 내가

+0

기본 V alue는 해당 필드의 데이터베이스에 값이 없으면 ORM 계층이 반환하는 것입니다. makemigrations를 적용하고 마이그레이션하면 데이터베이스의 값이 변경되어서는 안됩니다. 필드 값을 변경하려는 경우이'https : // stackoverflow.com/questions/29787853/django-migrations-add-field-with-default-with-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)