web-dev-qa-db-ja.com

djangoではnull = True、空白= Trueを区別する

Djangoにデータベースフィールドを追加すると、通常models.CharField(max_length=100, null=True, blank=True)と書きます。同じことがForeignKeyDecimalFieldなどでも行われます。

  1. null=Trueのみ
  2. blank=Trueのみ
  3. null=Trueblank=True

異なる(CharFieldForeignKeyManyToManyFieldDateTimeField)フィールドに関して。 1/2/3を使用する利点/欠点は何ですか?

736
user993563

null=Trueは、DBのカラムに(NOT NULLに対して)NULLを設定します。 DateTimeFieldForeignKeyなどのDjangoフィールド型の空白値は、NULLとしてDBに格納されます。

blank=Trueは、フィールドがフォームで必須かどうかを決定します。これには管理者とあなた自身のカスタムフォームが含まれます。 blank=Trueの場合、フィールドは必須ではありませんが、Falseの場合、フィールドは空白にできません。

この2つの組み合わせは非常に頻繁に発生します。通常、フォームでフィールドを空白にできるようにする場合は、そのフィールドにNULLの値を許可するデータベースも必要になります。例外はCharFieldsとTextFieldsで、これらは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

CHARTEXT型はDjangoによってNULLとして保存されることは決してないので、null=Trueは不要です。ただし、これらのフィールドの1つをNoneに手動で設定して、強制的にNULLに設定することができます。それが必要かもしれないシナリオがあるなら、あなたはまだnull=Trueを含めるべきです。

889
Chris Pratt

これが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
)
92
user

Djangoモデルフィールドリファレンスで述べたように: Link

フィールドオプション

次の引数は、すべてのフィールドタイプで使用できます。すべてオプションです。


null

Field.null

Trueの場合、Djangoは空の値をNULLとしてデータベースに保存します。デフォルトはFalseです。

nullCharFieldなどの文字列ベースのフィールドでは、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がある場合、そのフィールドは必須です。

35
DiogoLR

単にnull=True定義データベースはNULL値を受け入れるべきです、他方blank=Trueはフォーム検証で定義するか、または受け入れないべきです(blank=Trueがそのフィールドの値なしでフォームを受け入れる、そしてフォーム検証でblank=False [デフォルト値]このフィールドは必須ですエラー。

データベースに関連するnull=True/False

フォーム検証に関連するblank=True/False

18
Ranju R

Djangoモデル定義のオプションを見るとき、それらが(少なくとも)2つの目的を果たすことを理解することは非常に重要です:データベーステーブルを定義すること、そしてデフォルト形式とモデルフォームの検証を定義すること。データベースに影響するオプション、フォームに影響するオプション、両方に影響するオプションがあります。

nullblankに関しては、前者がデータベーステーブルの定義に影響を与え、後者がモデルの検証に影響を与えることを他の答えはすでに明らかにしています。私は、4つすべての可能な構成のユースケースを見ることによって、区別をさらに明確にすることができると思います。

  • null=Falseblank=False:これはデフォルト設定であり、すべての状況で値が必要であることを意味します。

  • null=Trueblank=True:これは、すべての状況においてフィールドがオプションであることを意味します。 (ただし、後述のとおり、これは ではありません 文字列ベースのフィールドをオプションにするための推奨される方法です。)

  • null=Falseblank=True:これはフォームが値を必要としないがデータベースは必要とすることを意味します。これにはいくつかの使用例があります。

    • この設定の最も一般的な用途は、オプションの文字列ベースのフィールドです。 ドキュメントに記載されているように 、Djangoの慣用句は、欠損値を示すために空の文字列を使用することです。 NULLも許可されている場合は、欠損値を示すために2つの異なる方法があります。

    • もう一つの一般的な状況は、あなたが他の値に基づいて自動的に一つのフィールドを計算したいということです(あなたのsave()メソッドで、例えば)。ユーザーに値をフォームに提供させたくない(したがってblank=True)が、値が常に提供されるようにデータベースに強制させたい(null=False)。

    • この設定のもう1つの用途は、ManyToManyFieldがオプションであることを示したい場合です。このフィールドはデータベースの列ではなく別のテーブルとして実装されているため、 nullは無意味です 。ただし、blankの値はフォームに影響しますが、関係がない場合に検証が成功するかどうかを制御します。

  • null=Trueblank=False:これはフォームに値が必要だがデータベースには必要ないことを意味します。これは最もまれにしか使われない設定かもしれませんが、いくつかの使用例があります:

    • ビジネスロジックで実際に必要とされていなくても、常に値を含めるようにユーザーに要求することをお勧めします。結局のところ、フォームはデータを追加および編集する唯一の方法です。人間の編集者に要求したいのと同じ厳密な検証を必要としないデータを生成しているコードがあるかもしれません。

    • 私が見たもう一つのユースケースは、あなたが カスケード削除を許可したくないForeignKeyを持っているときです 。つまり、通常の使用ではリレーションは常に存在するはずです(blank=False)が、それが指し示すものが削除されたとしても、このオブジェクトも削除したくはありません。その場合はnull=Trueon_delete=models.SET_NULLを使って簡単な ソフト削除 を実装することができます。

しかし、今日まであなたは答えを持っているかもしれませんが、null = True、blank = True、またはその両方をフィールドに入れるかどうかを判断するのは困難です。私は個人的には、開発者に非常に多くのオプションを提供することは非常に無用で混乱を招くと思います。ただし、必要な場合は、空白または空白を処理してください。

私はこの表に従います: enter image description here

enter image description here

7
saran3h

これは、blank= Trueおよびnull=Trueを含むフィールドの例です。

description = models.TextField(空白= True、null = True)

この場合、blank = True:はdescriptionフィールドを空白のままにしても構わないことをフォームに伝えます。

そして

null = True:データベースに、dbフィールドにnull値を記録してもエラーが発生しないことを確認してください。

6
Stryker
null = True

入力されるフィールドに対するデータベースの制約がないことを意味するので、このオプションを持つ入力に対してNULL値を持つオブジェクトを持つことができます。

blank = True

Djangoフォームには検証の制約がないということです。そのため、このモデルのmodelFormを記入するときは、このオプションを指定せずにfieldを記入しないでください。

2
Milad Kh

Djangoの管理画面で何かを保存すると、Djangoレベルとデータベースレベルの2段階で検証が行われます。数字フィールドにテキストを保存することはできません。

データベースのデータ型はNULLです。それは何もありません。 Djangoがデータベースにカラムを作成するとき、それらは空にできません。また、NULLを保存しようとすると、データベースエラーが発生します。

Django-Adminレベルでも、デフォルトですべてのフィールドが必須です。空白のフィールドは保存できません。Djangoはエラーをスローします。

あなたが空白のフィールドを保存したいのであれば、あなたはDjangoとデータベースレベルでそれを許可する必要があります。空白= True - 管理パネルの空のフィールドを許可しますnull = True - データベース列にNULLを保存することを許可します。

1
Yuriy Kots

nULL == TRUEの場合

    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)

空白== 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.

役に立つと思う場合は、賛成票を投じてください

1
Mohit Verma

CharFieldまたはTextFieldであってもnull=Trueが必要になる点が1つあります。それは、データベースに対して列にuniqueフラグが設定されている場合です。

つまり、DjangoでユニークなChar/TextFieldを使っているのなら、これを使う必要があります。

models.CharField(blank=True, null=True, unique=True)

一意でないCharFieldまたはTextFieldの場合、null=Trueをスキップすることをお勧めします。そうしないと、一部のフィールドがNULLとして設定され、その他のフィールドは ""となり、毎回NULLのフィールド値を確認する必要があります。

1
Nitin Nain

これがnull=Trueblank=Trueの主な違いです。

nullblankの両方のデフォルト値はFalseです。これらの値は両方ともフィールドレベルで機能します。つまり、フィールドnullblankのどちらを保持するかです。

null=Trueは、フィールドの値をNULL、つまりデータなしに設定します。基本的にはデータベースの列値です。

date = models.DateTimeField(null=True)

blank=Trueは、フィールドがフォームで必須かどうかを決定します。これには管理者とあなた自身のカスタムフォームが含まれます。

title = models.CharField(blank=True) // title can be kept blank.データベースには("")が格納されます。 null=Trueblank=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
1
Sonia Rani

空の、null入力可能なCharFieldを空の文字列としてではなくnullとして保存することに興味があるかもしれません 。これについては多くの議論があります、そしてあなたが遭遇するかもしれない非常に実用的な問題(例えば、あなたはnullでありえてユニークであるべきである各ユーザーのためにopenid URLを追加したいです)。

1
ramwin

Nullおよび空白のデフォルト値はFalseです。

Null:データベースに関連しています。特定のデータベース列がNULL値を受け入れるかどうかを定義します。

空白:検証関連です。 form.is_valid()を呼び出すときに、フォームの検証中に使用されます。

そうは言っても、null = Trueおよびblank = Falseのフィールドを持つことはまったく問題ありません。データベースレベルではフィールドはNULLでもかまいませんが、アプリケーションレベルでは必須フィールドです。

現在、ほとんどの開発者が誤解しているのは、CharFieldやTextFieldなどの文字列ベースのフィールドに対してnull = Trueを定義することです。それを避けてください。そうしないと、「データなし」の2つの可能な値、つまりNoneと空の文字列になります。 「データなし」に2つの値を設定することは冗長です。 Django規則では、NULLではなく空の文字列を使用します。

0
sharif_42