Django 強く推奨notは、CharFieldおよびTextField文字列ベースのフィールドにnull=True
を使用して、2つを持たないようにします「データなし」の可能な値(blank=True
で空の文字列を許可していると想定)。これは私には完全に理にかなっており、私はすべてのプロジェクトでこれを行っています。
Django 1.9は JSONField を導入し、基になるPostgres jsonb
データ型を使用します。上記の提案はJSONFieldに引き継がれますか(つまり、blank=True
の代わりにnull=True
を使用する必要があります)?または、代わりにnull=True
を使用する必要がありますか?または、代わりにdefault=dict
を使用する必要がありますか?または、..?どうして?
つまり、「データなし」の値を1つだけ許可したい場合、新しいネイティブJSONFieldの規則は何ですか?私は多くの調査を行い、公式を見つけることができなかったので、あなたの答えを支持してください。前もって感謝します。
Djangoコードから暗示される規則は、空の文字列ではなくnull JSON値をNULLとして(( CharField
の場合)。これは次の理由によります。
empty_strings_allowed
はField
のCharField
から継承され、True
に設定されます。
Django/db/models/fields/__ init __。py#L96
class Field(RegisterLookupMixin):
"""Base class for all field types"""
# Designates whether empty strings fundamentally are allowed at the
# database level.
empty_strings_allowed = True
...
ただし、JSONField
はFalse
で上書きします。
Django/contrib/postgres/fields/jsonb.py#L1
class JSONField(Field):
empty_strings_allowed = False
...
これにより、これらのフィールドの値を明示的に渡さずにモデルをインスタンス化すると、CharField
はデフォルトで""
になり、JSONField
はNone
になります。
Django/db/models/fields /init。py#L791
def get_default(self):
"""
Returns the default value for this field.
"""
if self.has_default():
if callable(self.default):
return self.default()
return self.default
if (not self.empty_strings_allowed or (self.null and
not connection.features.interprets_empty_strings_as_nulls)):
return None
return ""
したがって、JSONField
をオプションにする場合は、以下を使用する必要があります。
json_field = JSONField(blank=True, null=True)
CharField
と同様にblank=True
のみを使用する場合、json_field
引数を明示的に渡さずにMyModel.objects.create(...)
を実行しようとすると、IntegrityError
を取得します。
JSONFieldにデフォルト値を設定することは避けてください。私はちょうどそれを{}
に設定することによって男子生徒のエラーを作りました。その結果、明示的に設定されていない場合、新しいオブジェクトは最後のオブジェクトの値を受け取ります。そのa Python JSONFieldに固有の動作であり、私が検討するのを忘れていました。