PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jaka jest konwencja używania JSONField (natywnego postgres jsonb) w Django 1.9?

Wygląda na to, że konwencja wynikająca z kodu Django polega na przechowywaniu pustych wartości JSON jako NULL w przeciwieństwie do pustego ciągu (jak jest w konwencji dla CharField ). Mówię to z następujących powodów:

empty_strings_allowed jest dziedziczony z Field w CharField i jest ustawiony 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 , jednak zastępuje go False :

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

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

To powoduje, że CharField Domyślnie ma wartość "" i JSONField s na None kiedy tworzysz instancję modelu bez jawnego przekazywania wartości dla tych pól.

django/db /models/fields/początek .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 ""

Dlatego jeśli chcesz utworzyć JSONField opcjonalnie, musisz użyć:

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

Jeśli używasz tylko blank=True , tak jak w przypadku CharField , otrzymasz IntegrityError podczas próby uruchomienia MyModel.objects.create(...) bez przekazywania json_field argument jawnie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql DROP TABLE nie działa

  2. Zapytanie Django z order_by, differ i limit na Postgresql

  3. GIS:PostGIS/PostgreSQL vs. MySql vs. SQL Server?

  4. Robienie lewego sprzężenia ze sprzężeniami w starym stylu

  5. Jak przekonwertować dane wielokątów na segmenty linii za pomocą PostGIS