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 = websiteno hace el trabajonew_fieldawebsite.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__.pyde 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_migrationtambié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=Truedeclaración también:Incluso con
null=Truey / oblank=Truepuede 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_fieldestá vacío para tomar el valor de "sitio web", todo lo que necesita hacer es anular la función de guardar para suModelasí: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 syncdbpara actualizar la base de datos. y finalmente corres./manage.py makemigrationsy./manage.py migratefuente
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
Noneen la solicitud. La migración será superfluadefault=Nonemientras 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=Truea las columnas donde recibía el error. Luego ejecuté elpython manage.py makemigrationscomando.Inmediatamente después de ejecutar este comando (y antes de ejecutarlo
python manage.py migrate), eliminé elblank=True, null=Truede todas las columnas. Luego corrí depython manage.py makemigrationsnuevo. Me dieron la opción de cambiar las columnas yo mismo, que seleccioné.¡Entonces corrí
python manage.py migratey todo funcionó bien!fuente
Lo que Django realmente dice es:
Si está seguro de que ninguno de los valores de la
userprofiletabla 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
UserProfileinstancias con unnew_fieldvalor 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