PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

No Django 1.9, qual é a convenção para usar JSONField (native postgres jsonb)?


A convenção implícita no código Django parece ser armazenar valores JSON nulos como NULL ao invés de uma string vazia (como é a convenção para o CharField ). Digo isso pelo seguinte:

O empty_strings_allowed é herdado de Field em CharField , e está definido como 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 , no entanto, substitui-o por False :

django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
    empty_strings_allowed = False
    ...

Isso faz com que CharField 's para usar como padrão "" e JSONField 's para None quando você instancia um modelo sem passar explicitamente os valores para esses campos.

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

Portanto, se você quiser fazer um JSONField opcional, você deve usar:
json_field = JSONField(blank=True, null=True)

Se você usar apenas blank=True , como faria para CharField , você receberá um IntegrityError ao tentar executar MyModel.objects.create(...) sem passar um json_field argumento explicitamente.