djangoでnull = True、blank = Trueを区別する


904

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を使用する利点と欠点は何ですか?


8
あなたはここでそのことについて素敵な答えを持っている:stackoverflow.com/questions/8159310/...、ここで:stackoverflow.com/questions/4384098/...
juliomalegria


はい、私はこの使用例でwith ForeignKeyを使用していますがblank=True、を使用していませんnull=True。モデルが保存されたら、それから公開エントリーを作成して、自動的に「公開」したいと思います。したがってnull、すべてのモデルを「公開」する必要があるため、データベースに保存できませんが、adminでフィールドを空のままにできるようにしたいと考えています。
osa

[空のnull可能CharFieldを空の文字列ではなくnullとして保存する](code.djangoproject.com/ticket/4136)に興味があると思います。これについては多くの議論があり、遭遇する可能性のある非常に実用的な問題があります(たとえば、nullにすることができ、一意である必要がある各ユーザーのopenid urlを追加したい)。
ramwin 2018

回答:


1083

null=TrueDBの列にNULL(対NOT NULL)を設定します。などのDjangoのフィールド・タイプのブランク値DateTimeFieldまたはForeignKeyとして記憶するNULLDBです。

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

通常、フォーム内のフィールドを空白にできるようにする場合は、データベースにNULLそのフィールドの値を許可する必要があるため、この2つの組み合わせは頻繁に発生します。例外はCharFieldsとTextFieldsで、Djangoではとして保存されませんNULL。空白の値は、空の文字列('')として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タイプは決してとして保存されていないNULLので、ジャンゴによってnull=True不要です。ただし、これらのフィールドの1つを手動で設定してNone、強制的にに設定することができNULLます。それが必要になる可能性のあるシナリオがある場合でも、を含める必要がありますnull=True


8
IntegrityErrorDjangoがレコードをデータベースに保存しようとすると発生します。ユーザーがフィールドに入力する必要はありません。データベースレベルではフィールドがnullではないため、これは問題です。
クリスプラット2013年

5
いいえ、Chrisは、null = Trueを指定せずにblank = Trueを指定すると、DateTimeFieldで問題が発生する理由を指摘しようとしています。
Vinod Kurup 2013

4
Oracleユーザーへの注意:「CHARそしてDjangoのようにTEXT保存さNULLれることは決してない」というのは真実ではありません。これは、ほとんどのバックエンドのために真であるが、ジャンゴのOracleバックエンドは上記の文の例外ですので、Oracleは、NULLに空の文字列を強制しますジャンゴドキュメント
STVは

10
あなたの投稿に@ChrisPrattマイナー補正:CharFieldsができる(に翻訳NULLとしてデータベースに保存されますNoneあなたのセットはnull = Trueの場合はPythonで)。ドキュメントはさえ、それは「blanky」の値の2種類を可能にするので、ヌル=真を設定しないように言います。この動作をDjango 1.8 / MySQL 5.6でテストしたところです
Edward D'Souza

3
:誰もの組み合わせを言及するつもりはありませんかblank=Truenull=Falsedefault="something"
ブライアンH.

125

これは、Django 1.8のORMマップblanknullフィールドです。

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
)

41
つまり、blankデータベースには影響せnullず、データベース列でNULL値を許可するかどうかを制御します。この回答は、それを説明する非常に長い方法であり、に関する有用な情報を提供していませんblank
Carl Meyer

19
@CarlMeyer:他の人が同じことをする時間を節約できるので、データベースにマッピングして共有する方法を確認したいと思いました。理論と例は、メモリへの同化とコミットに関しては違いがあります。実際、使用していないデータベースのマッピングを追加する方法がわからなくなってしまいました。反対票をありがとう。これが便利だと思った人の数は明らかにあなたに反対です。
ユーザー

5
提示されたデータからいくつかの要約的な結論を引き出した場合、それは有用な回答になるかもしれませんが、生データのダンプを提示することは有用な回答だとは思いません。それは両方の効果を暗示する(さらなるコメントなし)ので、この場合には、実際には誤解を招く回答であるblanknull実際に場合、データベースの列に反映されなければならないblankだけPythonの取り扱いはなく、データベースの列に影響を与えます。他の人たちはそれが便利だと思ったら自由に賛成票を投じます。また、誤解を招く答えに惑わされている人にとって、それが役に立ったと考えることも可能です。
Carl Meyer

4
ほぼ3年前の受け入れられた答えはすべてを詳細に説明しています。ここで同じ情報を繰り返す意味はありません。
ユーザーの

47

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

フィールドオプション

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


null

Field.null

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

および nullなどの文字列ベースのフィールドでの使用は避けてください。空の文字列値は常にとしてではなく、空の文字列として保存されるためです。文字列ベースのフィールドにがある場合、それは「データなし」に2つの可能な値があることを意味します:と空の文字列。ほとんどの場合、「データなし」に2つの可能な値を設定するのは冗長です。Djangoの規約では、ではなく空の文字列を使用します 。CharFieldTextFieldNULLnull=TrueNULLNULL

文字列ベースのフィールドと非文字列ベースのフィールドの両方でblank=Truenullパラメーターがデータベースストレージにのみ影響するため(フォームを参照blank)、フォームで空の値を許可するかどうかも設定する必要があります。

注意

Oracleデータベースバックエンドを使用する場合、この属性に関係なく空の文字列を示すために値NULLが格納されます。


blank

Field.blank

の場合True、フィールドは空白にできます。デフォルトはFalseです。

これはとは異なることに注意してくださいnullnull純粋にデータベースblank関連ですが、検証関連です。フィールドにがある場合blank=True、フォームの検証では空の値を入力できます。フィールドにがある場合blank=False、そのフィールドは必須です。


46

Djangoモデルフィールド定義のオプションが(少なくとも)2つの目的を果たしていることを理解することが重要です。データベーステーブルを定義することと、デフォルトのフォーマットとモデルフォームの検証を定義することです。(値は常にカスタムフォームを提供することで上書きできるため、「デフォルト」と言います。)データベースに影響するオプション、フォームに影響するオプション、両方に影響するオプションがあります。

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

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

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

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

    • 最も一般的な用途は、オプションの文字列ベースのフィールドです。文書に記載、Djangoのイディオムは、欠損値を示すために、空の文字列を使用することです。もしはNULLまた、あなたが不足している値を示すために、二つの異なる方法で終わるだろうさせました。

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

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

  • null=Trueblank=False:これは、フォームには値が必要ですが、データベースには必要ないことを意味します。これは最も使用頻度の低い構成ですが、いくつかの使用例があります。

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

    • 私が見た別のユースケースは、カスケード削除ForeignKeyを許可したくないを持っている場合です。つまり、通常の使用では、リレーションは常に存在している必要があります()が、それが指すものが削除された場合、このオブジェクトも削除されないようにする必要があります。その場合、およびを使用して、単純な種類の一時的削除を実装できますblank=Falsenull=Trueon_delete=models.SET_NULL


1
これは完璧な答えです。可能なすべての組み合わせが非常に簡潔に説明されています!
RusI

1
受け入れられる答えでなければなりません。
トム・マック

28

あなたはあなたの答えを持っているかもしれませんが、今日までnull = Trueかblank = Trueか両方をフィールドに入れるかどうかを判断するのは困難です。私は個人的に、開発者に非常に多くのオプションを提供するのはかなり役に立たず混乱していると思います。ヌルまたはブランクを必要に応じて処理します。

はDjangoの2つのスクープからのこのテーブルに従います:ここに画像の説明を入力してください

各フィールドタイプにnullまたは空白をいつ使用するかを示す表


26

単純にnull=TrueデータベースがNULL値を受け入れるようにblank=True定義する一方で、フォーム検証でこのフィールドは空白値を受け入れるかどうかを定義します(blank=Trueそのフィールドに値のないフォームを受け入れblank=False、フォーム検証で[デフォルト値]を受け入れる場合、このフィールドは必須のエラーです。

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

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


11

ここでのフィールドの例ですblank= Trueと、null=True

description = models.TextField(blank = True、null = True)

この場合:: blank = True説明フィールドを空白のままにしても問題ないことをフォームに伝えます

そして

null = True:データベースに、dbフィールドにnull値を記録しても問題はなく、エラーが発生しないことを伝えます。


7
null = True

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

blank = True

djangoフォームには検証の制約がないことを意味します。したがって、modelFormこのモデルのを入力する場合、このオプションを入力せずにフィールドを残すことができます。


7

ここでの主な違いであるnull=Trueとはblank=True

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

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

6

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

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

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

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

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


5

Django adminに何かを保存すると、Djangoレベルとデータベースレベルの2つのステップで検証が行われます。数値フィールドにテキストを保存することはできません。

データベースのデータ型はNULLですが、何もありません。Djangoはデータベースに列を作成するときに、空にすることはできないことを指定します。また、NULLを保存しようとすると、データベースエラーが発生します。

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

したがって、空白のフィールドを保存する場合は、Djangoおよびデータベースレベルで許可する必要があります。blank = True-管理パネルの空のフィールドを許可しますnull = True-NULLをデータベース列に保存します。


5

またはnull=Trueでも必要なポイントが1つあります。それは、データベースに列のフラグが設定されている場合です。CharFieldTextFieldunique

つまり、Djangoに一意のChar / TextFieldがある場合、これを使用する必要があります。

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

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


3

nullはデータベース用、空白はフィールドの検証用で、textfieldなどのユーザーインターフェースに表示して人の姓を取得します。場合は姓= models.charfield(空白=真)これはオプションのフィールドは今あるとして、それは最後の名前を入力するようユーザーに求めるdidnot。場合は姓= models.charfield(ヌル=真)は 、それは、このフィールドはdoesnotユーザーからの任意の値を取得する場合、それは空の文字列「」としてデータベースに格納することを意味します。


1

モデルにおけるnull = Trueおよびblank = Trueの意味は、これらのフィールドがフォームクラスでどのように定義されたかにも依存します。

次のクラスを定義したとします。

class Client (models.Model):
    name = models.CharField (max_length=100, blank=True)
    address = models.CharField (max_length=100, blank=False)

フォームクラスが次のように定義されている場合:

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']
        widgets = {
            'name': forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
            'address': forms.TextInput (attrs = {'class': 'form-control form-control-sm'})
        }

次に、「name」フィールドは必須ではなく(モデルのblank = Trueにより)、「address」フィールドは必須です(モデルのblank = Falseにより)。

ただし、ClientFormクラスが次のように定義されている場合:

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']

    name = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )
    address = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )

次に、「宣言的に定義されたフィールドはそのままにされるため」https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/)の両方のフィールド(「name」と「address」)は必須です。つまり、フォームフィールドの 'required'属性のデフォルトはTrueであり、モデルでフィールドがblank = Trueに設定されている場合でも、フィールド 'name'および 'address'に入力する必要があります。



0

以下の表は、主な違いを示しています。

+--------------------------------------------------------------------+
| Purpose                  | null=True        | blank = True         |
|--------------------------|------------------|----------------------|
| Field can be empty in DB | Do this          | Unaffected           |
|--------------------------|------------------|----------------------|
| ModelForm(required field)| Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| Form Validation          | Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| on_delete=SET_NULL       | Need this        | Unaffected           |
+--------------------------------------------------------------------+

0

非常に簡単な言葉で

空白はnullとは異なります。

null純粋にデータベース関連ですが、空白は検証関連です(フォームで必須)

もしそうならnull=True、Djangoはそうしstore empty values as NULL in the databaseます。フィールドにがある場合blank=True、フォームの検証が行われallow entry of an empty valueます。フィールドにblank = Falseがある場合、そのフィールドは必須です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.