Djangoにデータベースフィールドを追加すると、通常models.CharField(max_length=100, null=True, blank=True)
と書きます。同じことがForeignKey
、DecimalField
などでも行われます。
null=True
のみblank=True
のみnull=True
、blank=True
異なる(CharField
、ForeignKey
、ManyToManyField
、DateTimeField
)フィールドに関して。 1/2/3を使用する利点/欠点は何ですか?
null=True
は、DBのカラムに(NOT NULL
に対して)NULL
を設定します。 DateTimeField
やForeignKey
などのDjangoフィールド型の空白値は、NULL
としてDBに格納されます。
blank=True
は、フィールドがフォームで必須かどうかを決定します。これには管理者とあなた自身のカスタムフォームが含まれます。 blank=True
の場合、フィールドは必須ではありませんが、False
の場合、フィールドは空白にできません。
この2つの組み合わせは非常に頻繁に発生します。通常、フォームでフィールドを空白にできるようにする場合は、そのフィールドにNULL
の値を許可するデータベースも必要になります。例外はCharField
sとTextField
sで、これらはDjangoではNULL
として never に保存されています。空白値は空の文字列(''
)としてDBに格納されます。
いくつかの例:
models.DateTimeField(blank=True) # raises IntegrityError if blank
models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form
明らかに、これら2つのオプションは論理的には意味がありません(ただし、フォームでフィールドを常に必須にする場合はnull=True, blank=False
のユースケースがありますが、シェルなどでオブジェクトを扱う場合はオプションです)。
models.CharField(blank=True) # No problem, blank is stored as ''
models.CharField(null=True) # NULL allowed, but will never be set as NULL
CHAR
とTEXT
型はDjangoによってNULL
として保存されることは決してないので、null=True
は不要です。ただし、これらのフィールドの1つをNone
に手動で設定して、強制的にNULL
に設定することができます。それが必要かもしれないシナリオがあるなら、あなたはまだnull=True
を含めるべきです。
これがORMがDjango 1.8のblank
フィールドとnull
フィールドをマッピングする方法です。
class Test(models.Model):
charNull = models.CharField(max_length=10, null=True)
charBlank = models.CharField(max_length=10, blank=True)
charNullBlank = models.CharField(max_length=10, null=True, blank=True)
intNull = models.IntegerField(null=True)
intBlank = models.IntegerField(blank=True)
intNullBlank = models.IntegerField(null=True, blank=True)
dateNull = models.DateTimeField(null=True)
dateBlank = models.DateTimeField(blank=True)
dateNullBlank = models.DateTimeField(null=True, blank=True)
PostgreSQL 9.4 用に作成されたデータベースフィールドは次のとおりです。
CREATE TABLE Test (
id serial NOT NULL,
"charNull" character varying(10),
"charBlank" character varying(10) NOT NULL,
"charNullBlank" character varying(10),
"intNull" integer,
"intBlank" integer NOT NULL,
"intNullBlank" integer,
"dateNull" timestamp with time zone,
"dateBlank" timestamp with time zone NOT NULL,
"dateNullBlank" timestamp with time zone,
CONSTRAINT Test_pkey PRIMARY KEY (id)
)
MySQL 5.6 用に作成されたデータベースフィールドは次のとおりです。
CREATE TABLE Test (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`charNull` VARCHAR(10) NULL DEFAULT NULL,
`charBlank` VARCHAR(10) NOT NULL,
`charNullBlank` VARCHAR(10) NULL DEFAULT NULL,
`intNull` INT(11) NULL DEFAULT NULL,
`intBlank` INT(11) NOT NULL,
`intNullBlank` INT(11) NULL DEFAULT NULL,
`dateNull` DATETIME NULL DEFAULT NULL,
`dateBlank` DATETIME NOT NULL,
`dateNullBlank` DATETIME NULL DEFAULT NULL
)
Djangoモデルフィールドリファレンスで述べたように: Link
フィールドオプション
次の引数は、すべてのフィールドタイプで使用できます。すべてオプションです。
null
Field.null
True
の場合、Djangoは空の値をNULL
としてデータベースに保存します。デフォルトはFalse
です。
null
やCharField
などの文字列ベースのフィールドでは、TextField
を使用しないでください。空の文字列値は、NULL
ではなく、常に空の文字列として格納されるためです。文字列ベースのフィールドにnull=True
がある場合、それは「データなし」の2つの可能な値:NULL
と空の文字列を持っていることを意味します。ほとんどの場合、「データなし」に2つの値を設定することは冗長です。 Django規則では、NULL
ではなく空の文字列を使用します。
null
パラメーターはデータベースストレージにのみ影響するため、フォームで空の値を許可する場合は、文字列ベースおよび非文字列ベースのフィールドの両方で、blank=True
を設定する必要もあります(blank
を参照)。注
Oracleデータベースバックエンドを使用する場合、この属性に関係なく空の文字列を示すために値NULLが格納されます
blank
Field.blank
True
の場合、フィールドは空白にできます。デフォルトはFalse
です。これは
null
とは異なることに注意してください。null
は純粋にデータベース関連ですが、blank
は検証関連です。フィールドにblank=True
がある場合、フォーム検証では空の値の入力が許可されます。フィールドにblank=False
がある場合、そのフィールドは必須です。
単にnull=True
定義データベースはNULL
値を受け入れるべきです、他方blank=True
はフォーム検証で定義するか、または受け入れないべきです(blank=True
がそのフィールドの値なしでフォームを受け入れる、そしてフォーム検証でblank=False
[デフォルト値]このフィールドは必須ですエラー。
データベースに関連するnull=True/False
フォーム検証に関連するblank=True/False
Djangoモデル定義のオプションを見るとき、それらが(少なくとも)2つの目的を果たすことを理解することは非常に重要です:データベーステーブルを定義すること、そしてデフォルト形式とモデルフォームの検証を定義すること。データベースに影響するオプション、フォームに影響するオプション、両方に影響するオプションがあります。
null
とblank
に関しては、前者がデータベーステーブルの定義に影響を与え、後者がモデルの検証に影響を与えることを他の答えはすでに明らかにしています。私は、4つすべての可能な構成のユースケースを見ることによって、区別をさらに明確にすることができると思います。
null=False
、blank=False
:これはデフォルト設定であり、すべての状況で値が必要であることを意味します。
null=True
、blank=True
:これは、すべての状況においてフィールドがオプションであることを意味します。 (ただし、後述のとおり、これは ではありません 文字列ベースのフィールドをオプションにするための推奨される方法です。)
null=False
、blank=True
:これはフォームが値を必要としないがデータベースは必要とすることを意味します。これにはいくつかの使用例があります。
この設定の最も一般的な用途は、オプションの文字列ベースのフィールドです。 ドキュメントに記載されているように 、Djangoの慣用句は、欠損値を示すために空の文字列を使用することです。 NULL
も許可されている場合は、欠損値を示すために2つの異なる方法があります。
もう一つの一般的な状況は、あなたが他の値に基づいて自動的に一つのフィールドを計算したいということです(あなたのsave()
メソッドで、例えば)。ユーザーに値をフォームに提供させたくない(したがってblank=True
)が、値が常に提供されるようにデータベースに強制させたい(null=False
)。
この設定のもう1つの用途は、ManyToManyField
がオプションであることを示したい場合です。このフィールドはデータベースの列ではなく別のテーブルとして実装されているため、 null
は無意味です 。ただし、blank
の値はフォームに影響しますが、関係がない場合に検証が成功するかどうかを制御します。
null=True
、blank=False
:これはフォームに値が必要だがデータベースには必要ないことを意味します。これは最もまれにしか使われない設定かもしれませんが、いくつかの使用例があります:
ビジネスロジックで実際に必要とされていなくても、常に値を含めるようにユーザーに要求することをお勧めします。結局のところ、フォームはデータを追加および編集する唯一の方法です。人間の編集者に要求したいのと同じ厳密な検証を必要としないデータを生成しているコードがあるかもしれません。
私が見たもう一つのユースケースは、あなたが カスケード削除を許可したくないForeignKey
を持っているときです 。つまり、通常の使用ではリレーションは常に存在するはずです(blank=False
)が、それが指し示すものが削除されたとしても、このオブジェクトも削除したくはありません。その場合はnull=True
とon_delete=models.SET_NULL
を使って簡単な ソフト削除 を実装することができます。
これは、blank= True
およびnull=True
を含むフィールドの例です。
description = models.TextField(空白= True、null = True)
この場合、blank = True
:はdescriptionフィールドを空白のままにしても構わないことをフォームに伝えます。
そして
null = True
:データベースに、dbフィールドにnull値を記録してもエラーが発生しないことを確認してください。
null = True
入力されるフィールドに対するデータベースの制約がないことを意味するので、このオプションを持つ入力に対してNULL値を持つオブジェクトを持つことができます。
blank = True
Djangoフォームには検証の制約がないということです。そのため、このモデルのmodelForm
を記入するときは、このオプションを指定せずにfieldを記入しないでください。
Djangoの管理画面で何かを保存すると、Djangoレベルとデータベースレベルの2段階で検証が行われます。数字フィールドにテキストを保存することはできません。
データベースのデータ型はNULLです。それは何もありません。 Djangoがデータベースにカラムを作成するとき、それらは空にできません。また、NULLを保存しようとすると、データベースエラーが発生します。
Django-Adminレベルでも、デフォルトですべてのフィールドが必須です。空白のフィールドは保存できません。Djangoはエラーをスローします。
あなたが空白のフィールドを保存したいのであれば、あなたはDjangoとデータベースレベルでそれを許可する必要があります。空白= True - 管理パネルの空のフィールドを許可しますnull = True - データベース列にNULLを保存することを許可します。
The default value of both null and blank is False. Both of these values work
at field level i.e., whether we want to keep a field null or blank.
null=True will set the field’s value to NULL i.e., no data. It is
basically for the databases column value.
date = models.DateTimeField(null=True)
blank=True determines whether the field will be required in forms. This
includes the admin and your own custom forms.
title = models.CharField(blank=True) // title can be kept blank. In the
database ("") will be stored.
役に立つと思う場合は、賛成票を投じてください
CharField
またはTextField
であってもnull=True
が必要になる点が1つあります。それは、データベースに対して列にunique
フラグが設定されている場合です。
つまり、DjangoでユニークなChar/TextFieldを使っているのなら、これを使う必要があります。
models.CharField(blank=True, null=True, unique=True)
一意でないCharFieldまたはTextFieldの場合、null=True
をスキップすることをお勧めします。そうしないと、一部のフィールドがNULLとして設定され、その他のフィールドは ""となり、毎回NULLのフィールド値を確認する必要があります。
これがnull=True
とblank=True
の主な違いです。
null
とblank
の両方のデフォルト値はFalseです。これらの値は両方ともフィールドレベルで機能します。つまり、フィールドnull
とblank
のどちらを保持するかです。
null=True
は、フィールドの値をNULL
、つまりデータなしに設定します。基本的にはデータベースの列値です。
date = models.DateTimeField(null=True)
blank=True
は、フィールドがフォームで必須かどうかを決定します。これには管理者とあなた自身のカスタムフォームが含まれます。
title = models.CharField(blank=True) // title can be kept blank.
データベースには("")
が格納されます。 null=True
blank=True
これは、すべての状況においてフィールドがオプションであることを意味します。
epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a
空の、null入力可能なCharFieldを空の文字列としてではなくnullとして保存することに興味があるかもしれません 。これについては多くの議論があります、そしてあなたが遭遇するかもしれない非常に実用的な問題(例えば、あなたはnullでありえてユニークであるべきである各ユーザーのためにopenid URLを追加したいです)。
Nullおよび空白のデフォルト値はFalseです。
Null:データベースに関連しています。特定のデータベース列がNULL値を受け入れるかどうかを定義します。
空白:検証関連です。 form.is_valid()を呼び出すときに、フォームの検証中に使用されます。
そうは言っても、null = Trueおよびblank = Falseのフィールドを持つことはまったく問題ありません。データベースレベルではフィールドはNULLでもかまいませんが、アプリケーションレベルでは必須フィールドです。
現在、ほとんどの開発者が誤解しているのは、CharFieldやTextFieldなどの文字列ベースのフィールドに対してnull = Trueを定義することです。それを避けてください。そうしないと、「データなし」の2つの可能な値、つまりNoneと空の文字列になります。 「データなし」に2つの値を設定することは冗長です。 Django規則では、NULLではなく空の文字列を使用します。