OperationalError

lors de l'ajout de champs à des modèles

Le problème exposé dans ce sujet a été résolu.

Bonjour,
En ce moment je découvre le Python (3.4.3) avec Django (1.8.4).
Le problème est qu'il m'arrive très souvent d'oublier des champs pour des modèles, et en ajouter après coup génère une erreur :

Exception Type: OperationalError Exception Value: no such column: django_website_contenttype.enabled

La meilleure solution que j'ai trouvée est de supprimer la base de données puis de syncdb. En plus d'être une mauvaise solution, cette fois j'ai des données dans ma base de données que je n'ai pas envie de devoir réécrire…
J'ai testé South, mais il n'est pas compatible avec les versions de Python et Django que j'utilise.

Connaissez-vous une façon (simple si possible) d'actualiser mes bases de données, en fonction des modèles mis à jour ?
Merci d'avance !

Salut,

Depuis Djanog 1.7, South a été integré au projet directement (d'ou l'incompatibilité avec la version courante). Pour mettre à jour tes modèles, tu dois faire un :

1
python manage.py makemigrations

Cela va te créer un nouveau fichier dans les dossiers migrations de chaque application qui composent ton projet et qui ont eu des modification dans leur modèle. Puis pour appliquer ces modifications à ta base de données :

1
python manage.py migrate

Après ca tu peux relancer ton serveur de dev, tout devrait mieux fonctionner. Tu peux trouver plus d'informations sur ces commandes et leurs options ici : https://docs.djangoproject.com/fr/1.8/topics/migrations/

Quelle modifications as tu fait exactement ? (Poste des exemples eventuellement)

As tu fait un bash python manage.py migrate, tu as peut être déjà des migrations en attente d'être appliquer à ta base de données (que contiennent les dossier migrations des applications qui composent ton projet ?) ?

Au début j'avais ça :

class ContentType(models.Model): name = models.CharField(max_length=64, verbose_name="Name") slug = models.SlugField(max_length=64, verbose_name="Slug") categories = models.ForeignKey(ContentCategory, verbose_name="Category"); script_url = models.URLField(max_length=256, verbose_name="Script URL") icon = models.ImageField(verbose_name="Icon") date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Creation date")

Et j'y ai rajouté :

1
enabled = models.BooleanField(verbose_name="Activated")

Oui, j'ai essayé de migrate après.
Je n'ai pas de dossier migrations :/

Pas de dossier migrations ? C'est un nouveau projet ou il vient d'une version plus ancienne de Django ? Ton projet fonctionnait avant de faire cette modification ?

Si ton projet n'a jamais fonctionne, tu dois faire un python manage.py migrate [le nom de ton app]

Peux tu mettre l'arborescence de ton projet actuellement ?

+0 -0

D'accord, y a quelques soucis dans ton arborescence, tu as utilisé les commandes de Django pour créer le projet et l'application ?

1
2
python manage.py startproject my_site
python manage.py startapps my_first_app

Normalement tu devrais plutot avoir une arborescence de ce genre:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
|-my_site
  |-my_first_app
    |-migrations
      |-0001_initial.py
    |-models.py
    |-urls.py
    |-views.py
  |-settings.py
  |-urls.py
  |-wsgi.py
|-manage.py

Django définit deux choses que tu n'as peut etre aps bien compris : le projet et les applications

Le projet contient l'ensemble de ton site qui peut etre composé de plusieurs applications : forum, tutoriels, messagerie…

Après la création de ton projet, tu dois créer une application avec la commande python manage.py startapps [le nom de l'app] qui va générer une arborescence avec les fichiers de base : models.py, views.py… ce qui permet d'organiser son projet directement en fonction des apps qui gère chacun leur urls, leur modeles, leurs vues… Cela permet entre autres de réutiliser ces applications entre plusieurs projets et de bien séparer les fonctionnalités

+0 -0

Je te conseille vivement, de tout supprimer et de recommencer (en sauvegardant ce que tu as dèjà codé bien sur), Django génére un certain nombre de chose par défaut, et ce serait bête de s'embeter avec ça dès la première fois ;)

N'hésite pas à repasser pour la suite des problème.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte