2009-05-06 9 views
51

J'ai un petit site web avec quelques utilisateurs et j'aimerais ajouter un champ à l'un de mes modèles (et donc aux tableaux.) Le problème est que syncdb ne va bien sûr pas touchez les modèles existants et j'essaie de comprendre comment ajouter ce champ au modèle/table sans avoir à repeupler le tout.Ajout d'un champ à un modèle Django existant

Exemple:

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

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

Maintenant, je voudrais ajouter un champ URL (blank=True) au modèle Newspaper sans casser les profils utilisateur.

Des idées?

Répondre

38

Il n'y a pas de façon intégrée de le faire. Cependant, il existe un certain nombre de projets de tiers qui le feront pour vous. Les deux principaux sont appelés South et django-evolution, bien qu'il y en ait plusieurs autres (dont un avec lequel j'ai été impliqué, dmigrations).

Je recommande vivement le Sud - il a un certain nombre de caractéristiques très soignées et fonctionne très bien.

+0

Je pense que c'est aussi une bonne idée de se sentir à l'aise de modifier vous-même vos bases de données, surtout quand il s'agit d'opérations simples comme l'ajout d'une nouvelle colonne ou d'une contrainte. C'est un excellent moyen d'apprendre les bases des bases de données de relations, ainsi que sur l'ORM de Django. Et c'est super facile une fois que vous savez comment. –

+4

pourriez-vous nous dire comment? – holmeswatson

+1

Et des années plus tard, South fait maintenant partie du noyau Django. –

18

Vous pouvez essayer d'obtenir le SQL pour votre nouveau champ à l'aide:

manage.py sql appname 

appname est le nom de l'application dans laquelle votre vie de classe journal. Puis, vous pouvez ajouter manuellement un champ à votre table appname_newspaper en utilisant ALTER TABLE. Je ne suis pas au courant d'un moyen de faire cela directement avec Django, puisque Django ne supporte pas les migrations.

+0

Un petit commentaire: si vous allez dans cette voie, je vous recommande d'effectuer la migration (remplir les valeurs initiales de la colonne) dans votre application Django , en recherchant simplement des valeurs non initialisées et en le faisant à la volée. Essayer de les remplir à partir d'une application différente risque de rencontrer des problèmes de mise en cache. –

1

2015 Réponse:

Exécutez la commande suivante:

python manage.py makemigrations 
python manage.py migrate 
Questions connexes