2015-01-02 6 views
11

私のアプリでは、いくつかのエントリを持つサーバーで1つのモデルを実行しています。このモデルには、SlugField、一意で、nullでない値を追加する必要があります。 SlugFieldは、trading_nameに基づいて入力されます。私は、この新しいフィールドを追加するために、私のモデルを変更し、メソッドの保存変更した:既に入力されたモデルでヌルでない一意のフィールドを追加してください。

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) 

モデルを変更した後、私はmanage.py makemigrationsを実行し、出力として、この移行を持っている:

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一意のconstrantのためにデフォルト値が機能しないので、manage.py migrateを実行することはできません。

私の質問は次のとおりです:Django 1.7でどうすればいいですか?私はスキーマの変更を適用し、私のデータベースに現在のエントリを保持する必要があります。

+1

ポストは、あなたの作成、移行、我々はそれを – FrEaKmAn

+0

感謝を変えることができるように@FrEaKmAn - 私は、適切な詳細を追加しました:) – MatheusJardimB

答えて

14

を参照して、カスタム1を書くことができ、私は答えを見つけていないが、私は1つのソリューションを作成することができます。

  • 最初に、スラッグフィールドをNULL可能にするための移行を作成しました。
  • 次に、モデル内のすべての行に対して適切な値を持つスラグ列を移入する別の移行を作成しました。
  • 次に、列に非NULL制約を追加する別の移行。
+3

これは同様にDjangoの提案であるように見えます - https://docs.djangoproject.com/en/ 1.9/howto/writing-migrations /#migrations-that-add-unique-fields – wasabigeek

2

あなたは何あなたのモデルの変更(フィールド、変更、などを追加)、その後、あなたは、例えば、その後、あなたがnull=Trueにフィールドを追加することができ、その後manage.py migrate

でマイグレーションを適用し、あなたをmanage.py makemigrationsを呼び出しますそれ以外の場合は1時間に

を、それを移入するためのスクリプトを作る、あなたが移行内のフィールドを移入する必要がある場合は生憎https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own

関連する問題