2016-05-18 23 views
7

Jakiś czas temu stworzyłem model Django:Django: Generowanie ślimakom danych pola do istniejących wpisów w bazie

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

Teraz chciałbym, aby wstawić pole ślimak:

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="") 

mój problem jest że kiedy utworzę migrację, Django prosi mnie o wstawienie wartości domyślnej dla pola slug.

Moim pomysłem jest wygenerowanie ślimaka podczas migracji dla istniejących wpisów w bazie danych, jest sposób na zrobienie tego?

Dzięki!

+0

Czy to '' def AutoSlugField' ault'param? – Gocht

Odpowiedz

9

To jest kod, który mam w tej samej sytuacji.

models.py:

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

Uwaga null = True, który jest kompatybilny z unikalnym polu W moich wędrówek, Dodaję migracji danych przez ręczną edycję pliku migracji

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

Dzięki! Działa to idealnie :) – markdesign