52 votes

Ajout d'un champ à un modèle Django existant

J'ai un petit site web avec quelques utilisateurs et j'aimerais ajouter un champ à l'un de mes modèles (et donc à l'une de mes tables.) Le problème est le suivant syncdb J'essaie donc de trouver comment ajouter ce champ au modèle/tableau sans avoir à repeupler l'ensemble.

Exemple :

class Newspaper(models.Model):
    name = models.CharField()

class UserProfile(models.Model):
    user = models.ForeignKey(user, unique=True)
    reads = models.ManyToManyField(Newspaper)

Je voudrais maintenant ajouter un champ URL ( blank=True ) à la Newspaper sans briser les profils des utilisateurs.

Des idées ?

38voto

Daniel Roseman Points 199743

Il n'y a pas de moyen intégré de le faire. Cependant, il existe un certain nombre de projets tiers qui le feront pour vous. Les deux principaux s'appellent Sud y django-évolution mais il en existe d'autres (dont une à laquelle j'ai participé, dmigrations).

Je recommanderais sans hésiter South - il possède un certain nombre de fonctionnalités très intéressantes et fonctionne très bien.

18voto

Dominic Rodger Points 44489

Vous pouvez essayer d'obtenir le SQL pour votre nouveau champ en utilisant :

manage.py sql appname

appname est le nom de l'application dans laquelle vit votre classe de journaux.

Ensuite, vous pourriez ajouter manuellement un champ à vos appname_newspaper en utilisant ALTER TABLE . Je ne connais pas de moyen de faire cela directement avec Django, puisque Django ne prend pas en charge les migrations.

6voto

tonemcd Points 161

Juste pour réitérer l'utilisation de South - il fait l'objet d'un développement continu (que la documentation ne suit pas toujours), mais il est très très utile.

Je l'ai utilisé pour migrer une ancienne base de données (une table) vers plusieurs modèles Django (avec des champs ForeignKey, ManyToMany et autres) et il m'a énormément aidé. J'ai divisé les migrations en zones telles que "ajouter un champ", "ajouter un modèle", "remplir la table de consultation ManyToMany", "remplir les champs de clé étrangère", etc.

Vous pouvez utiliser du code python dans les migrations, ce qui facilite le passage inévitable des données d'un format à l'autre (par exemple, les représentations textuelles de la date et de l'heure - ugh, dans les champs de la base de données DateTime).

Hautement recommandé.

2voto

Kostyantyn Points 661

Daniel Roseman, merci.

On dirait que Sud a des problèmes avec mysql . J'ai obtenu cette erreur après avoir simplement ajouté deux nouvelles colonnes à un tableau existant.

! Erreur trouvée pendant l'exécution réelle de la migration ! Abandon.

! Puisque vous avez une base de données qui ne supporte pas l'exécution !

d'instructions modifiant le schéma dans les transactions, nous avons eu ! à laisser dans un état intermédiaire entre les migrations.

Alors, j'ai essayé django-évolution et tout s'est bien passé même avec mysql.

1voto

macdonjo Points 478

Réponse de 2015 :

Exécutez ce qui suit :

python manage.py makemigrations
python manage.py migrate

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X