PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

In Django 1.9, qual è la convenzione per l'utilizzo di JSONField (nativo postgres jsonb)?

La convenzione implicita nel codice Django sembra essere quella di memorizzare i valori JSON null come NULL al contrario di una stringa vuota (come è la convenzione per CharField ). Lo dico per i seguenti motivi:

Il empty_strings_allowed viene ereditato da Field in CharField , ed è impostato su 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 , tuttavia, lo sovrascrive con False :

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

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

Ciò causa CharField Il valore predefinito è "" e JSONField 's a None quando istanzia un modello senza passare in modo esplicito i valori per questi campi.

django/db /models/fields/inizializzazione .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 ""

Pertanto, se vuoi creare un JSONField facoltativo, devi usare:

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

Se utilizzi solo blank=True , come faresti per CharField , riceverai un IntegrityError quando si tenta di eseguire MyModel.objects.create(...) senza passare un json_field argomento in modo esplicito.