2016-05-18 17 views
7

Qualche tempo fa ho creato un modello di Django:Django: generare dati di campo slug per le voci esistenti nel database

class Product(models.Model): 
    name = models.CharField(verbose_name=_('Nome'), max_length=100) 
    description = models.CharField(verbose_name=_('Descrizione'), blank=True, default="") 

Ora vorrei inserire un campo slug:

class Product(models.Model): 
    name = models.CharField(verbose_name=_('Nome'), max_length=100) 
    slug = AutoSlugField(populate_from='name', unique=True) 
    description = models.CharField(verbose_name=_('Descrizione'), blank=True, default="") 

Il mio problema è che quando creo una migrazione, Django mi chiede di inserire un valore predefinito per il campo slug.

La mia idea è di generare una lumaca durante la migrazione per le voci esistenti nel database, c'è un modo per farlo?

Grazie!

+0

fa che '' AutoSlugField' un def ault' param? – Gocht

risposta

9

questo è il codice che ho per la stessa situazione.

models.py:

slug = AutoSlugField(null=True, default=None, unique=True, populate_from='name') 

Annotare il nulla = True, che è compatibile con un campo univoco Nelle mie migrazioni, sto aggiungendo una migrazione dei dati modificando manualmente il file di migrazione

0007_my_migration.py:

def migrate_data_forward(apps, schema_editor): 
    for instance in MyModel.objects.all(): 
     print "Generating slug for %s"%instance 
     instance.save() # Will trigger slug update 

def migrate_data_backward(apps, schema_editor): 
    pass 

class Migration(migrations.Migration): 
... 

    operations = [ 
     migrations.AddField(
      model_name='my_model', 
      name='slug', 
      field=autoslug.fields.AutoSlugField(null=True, default=None, editable=False, populate_from='name', unique=True), 
      preserve_default=False, 
     ), 
     migrations.RunPython(
      migrate_data_forward, 
      migrate_data_backward, 
     ), 
    ] 
+0

Grazie! Funziona perfettamente :) – markdesign

Problemi correlati