4

プロジェクトでdjango-orderedmodel ( https://github.com/kirelagin/django-orderedmodel ) を使用しようとしています。

makemigrations を実行しても機能しません:

 You are trying to add a non-nullable field 'order' to slide without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 

私はこれをどこで間​​違っているのか知りたいです。ありがとう

4

1 に答える 1

6

orderフィールドは一意であるため、いくつかの移行手順でフィールドを追加し、移行で元のフィールドを置き換える必要がありますoperations

  • null 許容フィールドを追加し、デフォルトを に設定しますNULL
  • フィールドを各行で一意の値に設定します。
  • NOT NULL制約を追加します。

つまり、次のようなものです。

operations = [
    migrations.AddField('myapp.MyModel', 'order', models.PositiveIntegerField(null=True, unique=True)),
    migrations.RunPython(set_order),
    migrations.AlterField('myapp.MyModel', 'order', models.PositiveIntegerField(blank=True, unique=True)),
]

ここset_orderで、 を有効な値に設定する関数orderです。例:

def set_order(apps, schema_editor):
    MyModel = apps.get_model('myapp', 'MyModel')
    for i, model in enumerate(MyModel.objects.all()):
        model.order = i
        model.save()

デフォルト値 (つまり) を指定し、生成された移行で0を置き換えるのが最も簡単です。operations

于 2015-01-18T17:24:46.883 に答える