sql >> Databáze >  >> RDS >> PostgreSQL

Jaká je konvence pro použití JSONField (nativní postgres jsonb) v Django 1.9?

Zdá se, že konvence vyplývající z kódu Django je ukládat hodnoty null JSON jako NULL na rozdíl od prázdného řetězce (jak je konvence pro CharField ). Říkám to z následujícího důvodu:

empty_strings_allowed je zděděno z Field v CharField a je nastaven na 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 , však přepíše hodnotu False :

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

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

To způsobí CharField 's výchozí "" a JSONField 's na None když vytvoříte instanci modelu, aniž byste explicitně předali hodnoty pro tato pole.

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

Pokud tedy chcete vytvořit JSONField volitelné, musíte použít:

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

Pokud použijete pouze blank=True , stejně jako u CharField , zobrazí se IntegrityError při pokusu o spuštění MyModel.objects.create(...) bez předání json_field argumentovat explicitně.



  1. (2006, 'MySQL server odešel') v WSGI django

  2. Přepínače ng-zkontrolovány s ng-modelem

  3. zobrazit nový řádek mysql v HTML

  4. Proč se položka sekvence Postgres zvedne, i když se vytvoření objektu nezdaří?