PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Dans Django 1.9, quelle est la convention d'utilisation de JSONField (native postgres jsonb) ?

La convention implicite du code Django semble être de stocker les valeurs JSON nulles comme NULL par opposition à une chaîne vide (comme c'est la convention pour le CharField ). Je dis cela pour les raisons suivantes :

Le empty_strings_allowed est hérité de Field dans CharField , et est défini sur 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 , cependant, le remplace par False :

django/contrib/postgres/fields /jsonb.py#L13

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

Cela provoque CharField par défaut à "" et JSONField 's à None lorsque vous instanciez un modèle sans transmettre explicitement les valeurs de ces champs.

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 ""

Par conséquent, si vous souhaitez créer un JSONField facultatif, vous devez utiliser :

json_field = JSONField(blank=True, null=True)

Si vous utilisez uniquement blank=True , comme vous le feriez pour CharField , vous obtiendrez une IntegrityError lors de la tentative d'exécution de MyModel.objects.create(...) sans passer un json_field argument explicitement.