what - meet django
Agregue un campo no nulo y único con el modelo ya completado (2)
Tengo un modelo en mi aplicación que se ejecuta en un servidor con algunas entradas. Necesito agregar un SlugField
, único y no nulo para este modelo. El SlugField
será poblado basado en trading_name
. He cambiado mi modelo para agregar este nuevo campo y modificar el método de guardado:
class Supplier(StatusModel):
SLUG_MAX_LENGTH = 210
slug = models.SlugField(unique=True, max_length=SLUG_MAX_LENGTH)
trading_name = models.CharField(max_length=200, verbose_name=_(''trading name''))
...
def save(self, *args, **kwargs):
self.slug = orig = slugify(self.trading_name)[:Supplier.SLUG_MAX_LENGTH]
for x in itertools.count(1):
if not Supplier.objects.filter(slug=self.slug).exists():
break
# Truncate the original slug dynamically. Minus 1 for the hyphen.
self.slug = "%s-%d" % (orig[:Supplier.SLUG_MAX_LENGTH - len(str(x)) - 1], x)
self.full_clean()
super(Supplier, self).save(*args, **kwargs)
Después de cambiar el modelo, manage.py makemigrations
y obtuve esta migración como salida:
class Migration(migrations.Migration):
dependencies = [
(''opti'', ''0003_auto_20141226_1755''),
]
operations = [
migrations.AddField(
model_name=''supplier'',
name=''slug'',
field=models.SlugField(unique=True, default='''', max_length=210),
preserve_default=False,
),
]
No puedo ejecutar manage.py migrate
porque el valor predeterminado no funciona debido a la interpretación exclusiva.
Mi pregunta es: ¿Cómo puedo hacer esto con Django 1.7? Necesito aplicar el cambio de esquema y mantener las entradas actuales en mi base de datos.
Desafortunadamente, no encontré respuesta pero pude crear una solución:
- Primero, he creado una migración que permite que el campo de slug sea anulable;
- Luego, he creado otra migración que llena la columna de slug con los valores adecuados para cada fila en el modelo;
- Luego, otra migración que agrega la restricción no-nula en la columna.
manage.py makemigrations
cambios de modelo (agregar campo, cambiar, etc.), luego llama a manage.py makemigrations
, luego aplica las migraciones con manage.py migrate
Puede agregar el campo con null=True
, luego, por ejemplo, crea un script para completarlo una vez
De lo contrario, si necesita rellenar el campo dentro de la migración puede escribir uno personalizado, consulte https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own