web-dev-qa-db-ja.com

Django 1.9では、JSONField(ネイティブpostgres jsonb)を使用するための規則は何ですか?

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の規則は何ですか?私は多くの調査を行い、公式を見つけることができなかったので、あなたの答えを支持してください。前もって感謝します。

22
Cloud Artisans

Djangoコードから暗示される規則は、空の文字列ではなくnull JSON値をNULLとして(( CharFieldの場合)。これは次の理由によります。

empty_strings_allowedFieldCharFieldから継承され、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
    ...

ただし、JSONFieldFalseで上書きします。

Django/contrib/postgres/fields/jsonb.py#L1

class JSONField(Field):
    empty_strings_allowed = False
    ...

これにより、これらのフィールドの値を明示的に渡さずにモデルをインスタンス化すると、CharFieldはデフォルトで""になり、JSONFieldNoneになります。

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を取得します。

33
Ariel

JSONFieldにデフォルト値を設定することは避けてください。私はちょうどそれを{}に設定することによって男子生徒のエラーを作りました。その結果、明示的に設定されていない場合、新しいオブジェクトは最後のオブジェクトの値を受け取ります。そのa Python JSONFieldに固有の動作であり、私が検討するのを忘れていました。

3
Harel