これは、フォーム レベルではなくモデル レベルで解決することが重要です。データは API やインポート スクリプト、シェルなどから入力できるためですnull=True
。少しあいまいですが、私の経験では一般的に問題ではありません。そのあいまいさを受け入れたい場合は、いくつかの手順でそれを行う方法を次に示します。
null=True, blank=True
1)フィールドにセットしてチェンジで移動。
2) 既存のすべての空の文字列が NULL に変更されるようにデータをマッサージします。
items = Foo.objects.all()
for item in items:
if not item.somefield:
item.somefield = None
item.save()
3) モデルにカスタム メソッドを追加save()
します。
def save(self, *args, **kwargs):
# Empty strings are not unique, but we can save multiple NULLs
if not self.somefield:
self.somefield = None
super().save(*args, **kwargs) # Python3-style super()
4)unique=True
圃場に設置し、それも同様に移行します。
somefield
これで、管理者またはその他のデータ入力方法を使用しているかどうかにかかわらず、空または一意の値として保存できるようになります。
複数の移行を行いたくない場合は、1 回の移行で行う方法の例を次に示します。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
def set_nulls(apps, schema_editor):
Event = apps.get_model("events", "Event")
events = Event.objects.all()
for e in events:
if not e.wdid:
e.wdid = None
e.save()
class Migration(migrations.Migration):
dependencies = [
('events', '0008_something'),
]
operations = [
migrations.AlterField(
model_name='event',
name='wdid',
field=models.CharField(blank=True, max_length=32, null=True),
),
migrations.RunPython(set_nulls),
migrations.AlterField(
model_name='event',
name='wdid',
field=models.CharField(blank=True, max_length=32, null=True, unique=True),
),
]