Django Migrations Ajouter un Champ avec une valeur par Défaut en Fonction du Modèle
J'ai ajouté une nouvelle, non nullable domaine à mon Django modèle et suis en train d'utiliser les migrations de déployer ce changement. Comment pourrais-je définir la valeur par défaut à utiliser pour les modèles existants pour être certains de la fonction de ces modèles, plutôt qu'une constante?
Comme un exemple, nous allons dire que j'avais déjà fait un created_on
champ et j'ai juste ajouté un updated_on
champ dont la valeur que je veux régler d'abord le modèle de la created_on
. Comment faire une migration?
C'est ce que j'essaie de démarrer avec:
migrations.AddField(
model_name='series',
name='updated_as',
field=models.DateTimeField(default=????, auto_now=True),
preserve_default=False,
),
Vous devez vous connecter pour publier un commentaire.
J'ai juste appris à le faire avec une seule migration!
lors de l'exécution de
makemigrations
django devrait vous demander de définir une valeur par défaut. Définir ce que vous pouvez ici à garder heureux, et vous vous retrouverez avec la migrationAddField
vous l'avez mentionné.Modifier cette opération en 3 opérations:
AlterField
) pour en faire non nullable (comme ci-dessus, sans valeur par défaut).si vous vous retrouvez avec quelque chose comme.
avec vos fonctions définie comme quelque chose comme:
Sauf, vous savez, pas terrible; envisager d'utiliser F expressions et/ou fonctions de base de données pour augmenter les performances de la migration pour les grandes bases de données.
reverse_func
, vous devez utilisermigrations.RunPython.noop
. Vérifiez les docs pour plus de détails - docs.djangoproject.com/en/2.1/ref/migration-operations/...Vous devez le faire dans les deux migrations. Tout d'abord, ajouter votre domaine, mais de faire accepter les valeurs null. Créer un fichier de migration, comme d'habitude. Après cet ensemble de votre domaine pour ne pas les valeurs null et exécuter makemigrations de nouveau, mais ne pas lancer migrer encore. L'ouverture de la deuxième migration et de définir une fonction en haut:
puis, dans votre fichier de migration il y a une liste d'opérations. Avant l'alter exploitation du champ ajouter
et elle doit le faire
Vous devez également définir un revers pour votre fonction
set_my_defaults()
, dans le cas où vous ce que pour rétablir la migration dans l'avenir.L'inverse de la fonction dans ce cas besoin de ne rien faire, puisque vous êtes en train de supprimer le champ.
Et l'ajouter à RunPython: