2017-10-20 1 views
0

Ich habe ein Modell und eines seiner Felder ist definiert als blank=True, null=True. Ich änderte beide zu False und schrieb eine aufrufbare Funktion, die zufällige Zeichenfolgen zurückgibt. Ich setzte diese Funktion als default= dieses Feldes, und dann lief ich makemigrations und migrate, aber ich sehe weiterhin leere Felder in meiner Tabelle.Füllen vorhandener Felder in Django Modell

Ist das erwartete Verhalten? Und wenn ja, wie kann ich alle vorhandenen Felder füllen?

ich Django bin mit 1.10

+0

Standard v Die ORM-Ebene gibt zurück, wenn in der Datenbank für dieses Feld kein Wert angegeben ist. Beim Anwenden von Makemigrationen und Migrieren sollten die Werte in der Datenbank nicht geändert werden. Sie können dieses 'https: // stackoverflow.com/questions/29787853/django-migrations-add-field-with-default-als-Funktion-of-model' für den Fall, dass Sie Feldwerte ändern möchten, überprüfen. –

+0

@ArpitGoyal Dies ist kein DateField (oder Time), also wird 'auto_now' nicht für mich funktionieren. – alexandernst

+0

Etwas, was Sie tun können, ist 'null = False' und' blank = False' einzustellen und Migrationen auszuführen, so dass Django eine Nachricht anzeigt, dass Sie einen Wert für diese leeren Felder angeben müssen und 'str ('random_message')' und verlassen Sie die Shell –

Antwort

1

Direkt Anwendung makemigrations und migriert nicht die Daten für das Feld mit dem Standardwert von Ihrer Funktion ..

In Ihrer Migration Klasse zurückgegeben aktualisieren können Sie eine Funktion schreiben erreicht, dass so (die Aktualisierung der Werte in der Datenbank)

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

Quelle: Django Writing Migrations (populate_uuid_values.py)

Verwandte Themen