web-dev-qa-db-fra.com

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 des tableaux.) Le problème est que syncdb bien sûr ne touchera pas les modèles existants et je j'essaie de comprendre comment ajouter ce champ au modèle/tableau sans avoir à repeupler le tout.

Exemple:

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

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

J'aimerais maintenant ajouter un champ URL (blank=True) au modèle Newspaper sans casser les profils utilisateur.

Des idées?

51
Deniz Dogan

Il n'y a aucun moyen intégré de le faire. Cependant, il existe un certain nombre de projets tiers qui le feront pour vous. Les deux principaux sont appelés Sud et Django-evolution , bien qu'il y en ait également d'autres (dont celui auquel j'ai été impliqué, dmigrations).

Je recommanderais certainement South - il a un certain nombre de fonctionnalités vraiment intéressantes et fonctionne très bien.

38
Daniel Roseman

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 réside votre classe de journaux.

Ensuite, vous pouvez ajouter manuellement un champ à votre appname_newspaper table, en utilisant ALTER TABLE. Je ne connais pas de moyen de le faire directement avec Django, car Django ne prend pas en charge les migrations.

18
Dominic Rodger

Réponse 2015:

Exécutez ce qui suit:

python manage.py makemigrations
python manage.py migrate
1
User