PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

В Django 1.9 каква е конвенцията за използване на JSONField (роден postgres jsonb)?

Конвенцията, подразбираща се от кода на Django, изглежда е да съхранява нулевите JSON стойности като NULL за разлика от празен низ (както е конвенцията за CharField ). Казвам това поради следното:

empty_strings_allowed е наследено от Field в CharField и е зададено на 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 , обаче го заменя с False :

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

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

Това причинява CharField по подразбиране е "" и JSONField е на None когато създавате модел без изрично да подадете стойностите за тези полета.

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

Следователно, ако искате да направите JSONField по избор, трябва да използвате:

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

Ако използвате само blank=True , както бихте направили за CharField , ще получите IntegrityError когато се опитвате да стартирате MyModel.objects.create(...) без да предавате json_field аргумент изрично.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да прегледам всички предоставени бази данни и обекти за роля?

  2. Postregsql Разлика в датата на база секунди

  3. INSERT и сериализация на транзакция в PostreSQL

  4. Какво мислите за базите данни на Postgres и Firebird?

  5. Връзка грешка не съществува