2016-05-09 3 views
1

2つのスクープブックのアドバイス(6.2.4項)に従って、Charfieldを空白= Trueに設定したモデルをセットアップしました。Charfield nullエラー

しかし
class Supplier(models.Model): 
    unique_id = models.IntegerField(unique=True) 
    name = models.CharField(max_length=255, unique=True) 
    supplier_name = models.CharField(max_length=255, blank=True) 

私はエラーを取得するsupplier_nameフィールドにNoneを持っていないモデルのエントリを保存しよう: django.db.utils.IntegrityError:コラム「supplier_name」にNULL値は非NULL制約に違反します。 これに対処する最良の方法は何ですか?フィールド宣言でnull = Trueを使用するか、Noneを空の文字列に変換するか(理想的ではない)あるいは別のアプローチですか?

+0

どのように 'Supplier'インスタンスを作成していますか? 'supplier_name'を指定しないと、 'Supplier.objects.create(unique_id = 1、name = 'example')'とすると、 'supplier_name'が空の文字列として保存されると思います。しかし、明示的に 'supplier_name = None'を設定した場合、 'Supplier.objects.create(unique_id = 2、name = 'example2'、supplier_name = None)'の場合、Djangoはnullを保存しようとし、 'IntegrityError'を取得します。 'blank = True'オプションは、Djangoの管理とモデルのフォームに影響を与えます。基本的なデータベーススキーマには影響しません。また、自動的に' None'を '' ''に変換します。 – Alasdair

+0

それが問題です。私はdjangoが自動的にNoneを ''に変換し、 'supplier_name = None'で保存しようとしていると思った。 – Yunti

+0

喜んでそれを答えました。私は答えとしてコメントを追加しました。 – Alasdair

答えて

2

supplier_nameを指定しないと、 Supplier.objects.create(unique_id=1, name='example')の場合、supplier_nameは空の文字列として保存されます。

ただし、明示的にsupplier_name=Noneと設定すると、 Supplier.objects.create(unique_id=2, name='example2', supplier_name=None)の場合、Djangoはnullを保存しようとし、IntegrityErrorを取得します。

ブランク= Trueオプションは、モデルフォームとDjango管理者に影響します。基になるデータベーススキーマには影響しません。None''に自動的に変換します。

2スクープとDjangoのドキュメントがnull=Falseを推奨する理由は、''が「データなし」の唯一の値であるためです。 null=Trueがある場合、 'no data'の値は''Noneです。

null=Trueを使用する正当な理由の1つは、フィールドを一意にしたいが空の値を許可する場合です。

あなたの場合、コードを表示していないために何をすべきかを言うのは難しいです。理想的には、null=TrueにDjangoの規則に従うようにしてください。 supplier_name=Noneを設定しないようにコードを変更したり、supplier_name = supplier_name or ''に変換することができます。

0

このフィールドをnullにしておいても問題がなければ、null=Trueを使用するもう1つの利点は、defaultを通知する必要があるたびに同じモデルで他のファイルを追加するときに、値を避けるためにnull = trueを使用する方が良いです。

関連する問題