PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was ist die Konvention für die Verwendung von JSONField (natives Postgres-jsonb) in Django 1.9?

Die aus dem Django-Code implizierte Konvention scheint darin zu bestehen, Null-JSON-Werte als NULL zu speichern im Gegensatz zu einem leeren String (entsprechend der Konvention für CharField). ). Ich sage das aus folgendem Grund:

Die empty_strings_allowed wird von Field geerbt in CharField , und ist auf True gesetzt :

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 überschreibt es jedoch mit False :

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

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

Dies verursacht CharField ist standardmäßig "" und JSONField zu None wenn Sie ein Modell instanziieren, ohne die Werte für diese Felder explizit zu übergeben.

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

Wenn Sie also ein JSONField erstellen möchten optional müssen Sie verwenden:

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

Wenn Sie nur blank=True verwenden , wie Sie es für CharField tun würden , erhalten Sie einen IntegrityError beim Versuch, MyModel.objects.create(...) auszuführen ohne ein json_field zu übergeben Argument explizit.