2015-01-02 14 views
11

Mam jeden model w mojej aplikacji działający na serwerze z kilkoma wpisami. Muszę dodać SlugField, unikalny i niezerowy dla tego modelu. Numer SlugField zostanie wypełniony na podstawie trading_name. Zmieniłem mojego modelu, aby dodać tę nową dziedzinę i zmodyfikowane metody oszczędzania:Dodaj niezerowe i unikalne pole z już zapełnionym modelem

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) 

Po zmianie modelu Zabrakło mi manage.py makemigrations i dostał tę migrację jako wyjście:

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, 
     ), 
    ] 

I nie można uruchomić manage.py migrate, ponieważ domyślna wartość nie będzie działać z powodu unikatowej wartości granicznej.

Moje pytanie brzmi: jak mogę to zrobić z Django 1.7? Muszę zastosować zmianę schematu i zachować bieżące wpisy w mojej bazie danych.

+1

Wyślij swój stworzony migracja więc możemy zmienić ją – FrEaKmAn

+0

Dzięki @FrEaKmAn - Dodałem odpowiednie dane :) – MatheusJardimB

Odpowiedz

14

Niestety, nie znalazłem odpowiedzi, ale mogę stworzyć jedno rozwiązanie:

  • Najpierw stworzyłem migrację, która umożliwia zerowanie pola slug;
  • Następnie utworzyłem kolejną migrację, która wypełnia kolumnę ze ślimakami odpowiednimi wartościami dla każdego wiersza w modelu;
  • Następnie kolejna migracja, która dodaje nie-null ograniczenia w kolumnie.
+3

wygląda to jest sugestia Django, a także - https://docs.djangoproject.com/en/ 1.9/howto/writing-migrations/# migrations-that-add-unique-fields – wasabigeek

2

zrobić swój model zmiany (dodać pole, zmiany, etc), a następnie zadzwonić manage.py makemigrations, a następnie zastosować migracje z manage.py migrate

Możesz dodać pole z null=True, to na przykład zrobić skrypt, aby wypełnić go jednym razem

W przeciwnym razie, jeśli trzeba wypełnić pole ramach migracji można napisać niestandardową, patrz https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own

Powiązane problemy