web-dev-qa-db-fra.com

erreur auth_user avec Django 1.8 et syncdb/migrate

Lors de la mise à niveau vers Django 1.8 (avec zc.buildout) et de l'exécution de syncdb ou de migrer, le message suivant s'affiche:

Django.db.utils.ProgrammingError: relation "auth_user" does not exist

Un de mes modèles contient Django.contrib.auth.models.User:

user = models.ForeignKey(
    User, related_name='%(app_label)s_%(class)s_user',
    blank=True, null=True, editable=False
)

La mise à niveau vers Django 1.7 supprime l'erreur. Dois-je inclure l'objet Utilisateur différemment dans Django 1.8?

44
mpso

Je résous ce problème en exécutant auth d'abord, puis le reste de mes migrations:

python manage.py migrate auth
python manage.py migrate
96
Dave Lawrence

Sur mon environnement, je corrige cette makemigrations en cours d'exécution sur toutes les applications en relation avec Django.contrib.auth.models:

 manage.py makemigrations app_with_user_relation
manage.py migrate 
18
Pedro Vagner

J'ai également eu le même problème que j'ai résolu en utilisant ceux-ci:

python manage.py migrate auth
python manage.py migrate

Puis migrer fait son travail

17
Jastatham

Si vous utilisez heroku comme si j'étais couru

heroku run python manage.py makemigrations

Cela vous donnera probablement un message indiquant qu'il y a maintenant des changements. Ignorer ça puis courir

heroku run python manage.py migrate

cela vous donnera une sortie suggérant que quelque chose a été fait ..__ Enfin, lancez 

heroku run python manage.py createsuperuser
7
Aaron F

Ce problème est contenu en exécutant "makemigrations" pour toutes les applications qui n’ont pas encore été migrées, c’est-à-dire les applications ne disposant pas encore de fichier "initial_0001.py" dans leur répertoire de migration.

Ceci est fait (dans notre cas, nous utilisons un makefile) en exécutant pour chacune de ces applications:

manage.py makemigrations app_name

Une fois que cela est fait, vous pouvez exécuter:

manage.py migrate

comme d'habitude.

La cause sous-jacente de ceci est que pour une raison quelconque

manage.py makemigrations

est-ce que pas crée toujours ces migrations initiales si elles ne sont pas déjà là? Et cela conduit à l'erreur mentionnée. 

Au contraire,

manage.py makemigrations app_name

fait les crée toujours (si pas déjà là). Malheureusement, je ne peux pas comprendre les raisons de cette asymétrie.

7
Ytsen de Boer

Pour résoudre ce problème, voici ce que j'ai fait:

1) Recherchez tous les champs de relation de clé étrangère tels que OneToOneField, ForeignKey et ManyToManyFields dans votre projet, y compris les applications réutilisables faisant référence à auth.User ou importez l'utilisateur, puis définissez-le sur settings.AUTH_USER_MODEL comme indiqué ci-dessus. Au minimum utilisation:

'auth.User'

2) Pour tous les modèles ayant ce qui précède, assurez-vous qu’ils ont une migration Django valide (et non sud). S'ils effectuent des migrations vers le sud, renommez le répertoire en migrations_south, puis exécutez la commande makemigrations pour cette application:

./manage.py makemigrations affected_app

Parfois, il existe un dossier de migration Django sous un nom différent, pas le répertoire par défaut migrations. Dans de tels cas, faites référence à ceci via MIGRATION_MODULES dans votre fichier settings.py:

MIGRATION_MODULES = {'filer': 'filer.migrations_Django'}

Comme le problème était difficile à trouver sur des projets plus volumineux, j'ai commenté toutes les applications personnalisées dans INSTALLED_APPS dans settings.py et ai exécuté la commande test, puisqu’il exécutera migrate et tentera de recréer la base de données pour vous:

./manage.py test

On dirait que ça a réglé le problème pour moi. Je ne suis pas sûr si l'étape 1 est obligatoire ou simplement la meilleure pratique. Mais vous devez absolument convertir les applications en migrations.

À votre santé!

PS. Soyez prêt pour ce qui va arriver Django 1.9 . La commande syncdb sera supprimée. La méthode existante de synchronisation des applications sans migration est supprimée et les migrations sont obligatoires pour toutes les applications.

4
radtek

J'ai migré un ancien projet Django 1.6 vers Django 1.8 et nous avions précédemment utilisé syncdb pour migrer la base de données et nous n'avions nous n'avions pas les étapes de migration initiales pour toutes les applications de notre projet. Avec Django 1.8, vous aurez besoin d’une migration de base de données opérationnelle. Fonctionnement 

manage.py makemigrations <app_name>

pour toutes les applications de notre projet résolu nos problèmes.

0
Sebastian Wagner

Essayez de faire référence à l'utilisateur utilisant cette

from Django.conf import settings
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='%(app_label)s_%(class)s_user', blank=True, null=True, editable=False)
0
Rod Xavier

Peut-être avez-vous trouvé la réponse et résolu le problème, mais je tiens à souligner que, dans mon cas, le problème ci-dessus a été résolu en supprimant la base de données et en la recréant à nouveau, avec tous les privilèges des utilisateurs. J'ai été capable de le faire car je travaille dans un environnement hors production, mais le faire dans un environnement de transfert n'est pas une bonne idée, alors soyez prudent.

J'utilise python 2.7.12 et voici les spécifications de mon virtualenv:

Django==1.10.5
Django-crispy-forms==1.6.1
Django-registration-redux==1.4
djangorestframework==3.5.3
olefile==0.44
packaging==16.8
Pillow==4.0.0
psycopg2==2.6.2
0
khaled kachkorian