sql >> Base de Datos >  >> RDS >> PostgreSQL

En Django 1.9, ¿cuál es la convención para usar JSONField (jsonb de postgres nativo)?

La convención implícita del código Django parece ser almacenar valores JSON nulos como NULL a diferencia de una cadena vacía (como es la convención para el CharField ). Digo esto por lo siguiente:

El empty_strings_allowed se hereda de Field en CharField y se establece en 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 , sin embargo, lo anula con False :

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

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

Esto hace que CharField 's por defecto a "" y JSONField 's a None cuando crea una instancia de un modelo sin pasar explícitamente los valores para estos campos.

django/db /modelos/campos/inicio .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 ""

Por lo tanto, si desea crear un JSONField opcional, tienes que usar:

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

Si usa solo blank=True , como lo haría para CharField , obtendrá un IntegrityError al intentar ejecutar MyModel.objects.create(...) sin pasar un json_field argumento explícitamente.