python - Error de auth_user con Django 1.8 y syncdb/migrate
buildout django-syncdb (9)
Arreglo esto ejecutando auth primero, luego el resto de mis migraciones:
python manage.py migrate auth
python manage.py migrate
Al actualizar a Django 1.8 (con zc.buildout) y ejecutar syncdb o migrar, recibo este mensaje:
django.db.utils.ProgrammingError: relation "auth_user" does not exist
Uno de mis modelos contiene django.contrib.auth.models.User:
user = models.ForeignKey(
User, related_name=''%(app_label)s_%(class)s_user'',
blank=True, null=True, editable=False
)
La degradación a Django 1.7 elimina el error. ¿Debo incluir el objeto Usuario de forma diferente en Django 1.8?
En mi entorno, soluciono estas makemigrations
en makemigrations
en todas las aplicaciones que tienen relación con django.contrib.auth.models
:
manage.py makemigrations app_with_user_relation manage.py migrate
Este problema está contenido al ejecutar "makemigrations" para todas las aplicaciones que aún no se han migrado, es decir, las aplicaciones que aún no tienen un archivo "initial_0001.py" en su directorio de migraciones.
Esto se hace (en nuestro caso usamos un makefile) ejecutando para cada una de estas aplicaciones:
manage.py makemigrations app_name
Una vez hecho esto, puedes ejecutar:
manage.py migrate
como siempre.
La causa subyacente de esto es que por alguna razón
manage.py makemigrations
no siempre crea estas migraciones iniciales si aún no están allí. Y eso conduce al mencionado error.
De lo contrario,
manage.py makemigrations app_name
Siempre los crea (si no están ya allí). Desafortunadamente no puedo entender las razones de esta asimetría.
He migrado un antiguo proyecto Django 1.6 a Django 1.8 y anteriormente hemos usado syncdb para migrar la base de datos y no tuvimos pasos de migración iniciales para todas las aplicaciones en nuestro proyecto. Con Django 1.8, necesitará una migración de base de datos que funcione. Corriendo
manage.py makemigrations <app_name>
Para todas las aplicaciones en nuestro proyecto solucionamos nuestros problemas.
Para solucionar este problema aquí es lo que hice:
1) Encuentre todos los campos de relación de clave externa como OneToOneField, ForeignKey y ManyToManyFields en su proyecto, incluidas las aplicaciones reutilizables que se refieren a auth.User
o import User y auth.User
en la configuración. En uso mínimo:
''auth.User''
2) Para todos los modelos que tienen lo anterior, asegúrese de que los modelos tengan una migración de django válida (no al sur). Si tienen migraciones hacia el sur, cambie el nombre del directorio a migrations_south y luego ejecute el comando makemigrations para esa aplicación:
./manage.py makemigrations affected_app
A veces hay una carpeta de migraciones de django con un nombre diferente, no el directorio de migrations
predeterminado. En tales casos, haga referencia a esto a través de MIGRATION_MODULES
en su settings.py:
MIGRATION_MODULES = {''filer'': ''filer.migrations_django''}
Debido a que el problema era difícil de encontrar en proyectos más grandes, comenté todas las aplicaciones personalizadas en INSTALLED_APPS
en settings.py y ejecuté el comando de prueba, ya que ejecutará migrate e intentará volver a crear la base de datos:
./manage.py test
Parece que eso lo arregló para mí. No estoy seguro si el paso 1 es obligatorio o simplemente la mejor práctica. Pero definitivamente necesitas convertir las aplicaciones a migraciones.
¡Aclamaciones!
PD. Prepárate para lo que viene en Django 1.9 . El comando syncdb será eliminado. El método heredado de sincronización de aplicaciones sin migraciones se elimina, y las migraciones son obligatorias para todas las aplicaciones.
Quizás haya encontrado la respuesta y resuelto el problema, pero quería señalar que, en mi caso, el problema anterior se resolvió eliminando la base de datos y volviéndola a crear, con los privilegios completos de los usuarios. Pude hacerlo porque estoy trabajando en un entorno de no producción, pero no es una buena idea hacerlo en un entorno de ensayo, así que ten cuidado.
Estoy usando python 2.7.12
y las siguientes son las especificaciones de mi 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
Si estas usando heroku como si estuviera corriendo
heroku run python manage.py makemigrations
Esto probablemente le dará un mensaje diciendo que ahora hay cambios. Ignora eso y luego corre
heroku run python manage.py migrate
Esto le dará un resultado que sugiere que se ha hecho algo. Finalmente correr
heroku run python manage.py createsuperuser
También tuve el mismo problema, lo resolví usando estos:
python manage.py migrate auth
python manage.py migrate
Luego migra hace su trabajo
Trate de referirse al Usuario usando este
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)