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

Hvad er konventionen for brug af JSONField (native postgres jsonb) i Django 1.9?

Konventionen antydet fra Django-koden ser ud til at være at lagre null JSON-værdier som NULL i modsætning til som en tom streng (som konventionen er for CharField ). Jeg siger dette på grund af følgende:

empty_strings_allowed er nedarvet fra Field i CharField , og er indstillet til 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 , dog tilsidesætter det med False :

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

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

Dette forårsager CharField 's er som standard "" og JSONField 's til None når du instansierer en model uden eksplicit at videregive værdierne for disse felter.

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

Derfor, hvis du vil lave et JSONField valgfrit, du skal bruge:

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

Hvis du kun bruger blank=True , som du ville gøre for CharField , får du en IntegrityError når du forsøger at køre MyModel.objects.create(...) uden at sende et json_field argument eksplicit.



  1. PostgreSQL/performance én generel markør eller opret for hver forespørgsel

  2. Vis pdf-fil gemt på lokal disk med i Oracle Forms 6i

  3. SQL undtagen

  4. Implementering af Hacker News-rangeringsalgoritmen i SQL