sql >> Databasteknik >  >> RDS >> PostgreSQL

I Django 1.9, vad är konventionen för att använda JSONField (native postgres jsonb)?

Konventionen som antyds från Django-koden verkar vara att lagra null JSON-värden som NULL i motsats till som en tom sträng (som är konventionen för CharField ). Jag säger detta på grund av följande:

empty_strings_allowed ärvs från Field i CharField , och är inställd på 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 , däremot åsidosätter den med False :

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

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

Detta orsakar CharField 's till standard till "" och JSONField 's till None när du instansierar en modell utan att explicit skicka värdena för dessa fält.

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

Därför, om du vill skapa ett JSONField valfritt, du måste använda:

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

Om du bara använder blank=True , som du skulle göra för CharField , får du en IntegrityError när du försöker köra MyModel.objects.create(...) utan att skicka ett json_field argument uttryckligen.



  1. Koncept:Bygg Java-program och ladda det i Oracle DB - Wrapper-funktionen anropar java-funktionen med retur

  2. FEL 2068 (HY000):LADDA DATA LOKAL INFIL-filbegäran avvisades på grund av åtkomstbegränsningar

  3. Oracle kopierar rader till samma tabell med olika datum

  4. PHP PDO Bit(1) returnerar fel datatyp