2017-10-20 19 views
0

J'ai un modèle et l'un de ses champs est défini comme blank=True, null=True. J'ai changé à la fois False et a écrit une fonction appelable qui renvoie des chaînes aléatoires. J'ai défini cette fonction comme default= de ce champ, puis j'ai exécuté makemigrations et migrate, mais je vois toujours des champs vides dans ma table.Remplissage des champs existants dans le modèle Django

Est-ce que ce comportement est attendu? Et si oui, comment puis-je remplir tous les champs existants?

J'utilise Django 1.10

+0

défaut v alue est ce que la couche ORM renvoie si aucune valeur dans la base de données pour ce champ. L'application de makemigrations et de migrate ne doit pas modifier les valeurs de la base de données. Vous pouvez vérifier cette 'https: // stackoverflow.com/questions/29787853/django-migrations-ajouter-champ-avec-défaut-comme-fonction-de-modèle' dans le cas où vous voulez modifier les valeurs de champ. –

+0

@ArpitGoyal Ce n'est pas un champ DateField (ni Time), donc 'auto_now' ne fonctionnera pas pour moi. – alexandernst

+0

Quelque chose que vous pouvez faire est de mettre 'null = False' et' blank = False' et lancer des migrations afin que Django affiche un message disant que vous devez fournir une valeur pour ces champs vides et vous mettez 'str ('random_message')' et sortir de la coquille –

Répondre

1

application directe makemigrations et la migration ne met pas à jour les données du champ avec la valeur par défaut retourné par votre fonction ..

Dans votre Migration classe, vous pouvez écrire une fonction qui permet d'atteindre si (mise à jour des valeurs dans votre base de données)

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

Source: Django Writing Migrations (populate_uuid_values.py)