Sé que desde Django 1.7 no necesito usar South ni ningún otro sistema de migración, así que solo estoy usando un comando simple python manage.py makemigrations
Sin embargo, todo lo que obtengo es este error:
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
Aquí está models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
¿Cuáles son las opciones?
Respuestas:
Debe proporcionar un valor predeterminado:
fuente
default = website
no hace el trabajonew_field
awebsite
.Si se encuentra en el ciclo de desarrollo inicial y no le importan los datos de su base de datos actual , simplemente puede eliminarlos y luego migrar. Pero primero debe limpiar el directorio de migraciones y eliminar sus filas de la tabla (django_migrations)
fuente
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
de las migraciones, o de restaurarlo después, de lo contrario, las migraciones no funcionarán stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
también es obligatorioUna opción es declarar un valor predeterminado para 'new_field':
otra opción es declarar 'new_field' como un campo anulable:
Si decide aceptar 'new_field' como un campo anulable, es posible que desee aceptar 'no input' como entrada válida para 'new_field'. Entonces tienes que agregar la
blank=True
declaración también:Incluso con
null=True
y / oblank=True
puede agregar un valor predeterminado si es necesario:fuente
Si está al principio del ciclo de desarrollo, puede probar esto:
Eliminar / comentar ese modelo y todos sus usos. Aplicar migraciones. Eso eliminaría ese modelo y luego agregaría el modelo nuevamente, ejecutará migraciones y tendrá un modelo limpio con el nuevo campo agregado.
fuente
En caso de que alguien esté configurando un
ForeignKey
, puede permitir campos que aceptan valores NULL sin establecer un valor predeterminado:Si ya tiene datos almacenados en la base de datos, también puede establecer un valor predeterminado:
fuente
Si "sitio web" puede estar vacío
new_field
, entonces también debería configurarse como vacío.Ahora, si desea agregar lógica al guardar donde
new_field
está vacío para tomar el valor de "sitio web", todo lo que necesita hacer es anular la función de guardar para suModel
así:fuente
No puede agregar una referencia a la tabla que ya tiene datos dentro.
Cambio:
a:
hacer:
cambiar de nuevo:
hacer la migración de nuevo:
fuente
En new_file agregue la propiedad booleana null.
después de ejecutar un
./manage.py syncdb
para actualizar la base de datos. y finalmente corres./manage.py makemigrations
y./manage.py migrate
fuente
Puede usar el método de Django Doc desde esta página https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Crear predeterminado y usarlo
fuente
¿Ya tiene entradas de base de datos en la tabla
UserProfile
? Si es así, cuando agrega nuevas columnas, la base de datos no sabe qué configurar porque no puede serNULL
. Por lo tanto, le pregunta en qué desea establecer esos campos en la columnanew_fields
. Tuve que eliminar todas las filas de esta tabla para resolver el problema.(Sé que esto fue respondido hace algún tiempo, pero me encontré con este problema y esta fue mi solución. Con suerte, ayudará a cualquier persona nueva que vea esto)
fuente
Honestamente, creo que la mejor manera de evitar esto fue simplemente crear otro modelo con todos los campos que necesita y con un nombre ligeramente diferente. Ejecute migraciones. Elimine el modelo no utilizado y vuelva a ejecutar las migraciones. Voila.
fuente
Si está de acuerdo con truncar la tabla del modelo en cuestión, puede especificar un valor predeterminado único de
None
en la solicitud. La migración será superfluadefault=None
mientras que su código no tenga por defecto. Se puede aplicar muy bien porque ya no hay datos en la tabla que requerirían un valor predeterminado.fuente
Estaba al principio de mi ciclo de desarrollo, por lo que puede que esto no funcione para todos (pero no veo por qué no sería así).
Agregué
blank=True, null=True
a las columnas donde recibía el error. Luego ejecuté elpython manage.py makemigrations
comando.Inmediatamente después de ejecutar este comando (y antes de ejecutarlo
python manage.py migrate
), eliminé elblank=True, null=True
de todas las columnas. Luego corrí depython manage.py makemigrations
nuevo. Me dieron la opción de cambiar las columnas yo mismo, que seleccioné.¡Entonces corrí
python manage.py migrate
y todo funcionó bien!fuente
Lo que Django realmente dice es:
Si está seguro de que ninguno de los valores de la
userprofile
tabla es NULL, no dude e ignore la advertencia.La mejor práctica en tales casos sería crear una migración RunPython para manejar valores vacíos como se indica en la opción 2
En la migración de RunPython, debe encontrar todas las
UserProfile
instancias con unnew_field
valor vacío y poner un valor correcto allí (o un valor predeterminado como Django le pide que configure en el modelo). Obtendrá algo como esto:¡Que te diviertas!
fuente
En models.py
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
Necesita agregar algunos valores por defecto.
fuente
Si el SSH le da 2 opciones, elija el número 1 y ponga "Ninguno". Solo eso ... por el momento.
fuente