sql >> Database >  >> RDS >> PostgreSQL

Wat is in Django 1.9 de conventie voor het gebruik van JSONField (native postgres jsonb)?

De conventie die wordt geïmpliceerd uit de Django-code lijkt te zijn om null-JSON-waarden op te slaan als NULL in tegenstelling tot als een lege string (zoals de conventie is voor het CharField ). Ik zeg dit vanwege het volgende:

De empty_strings_allowed is overgenomen van Field in CharField , en is ingesteld op 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 , overschrijft het echter met False :

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

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

Dit veroorzaakt CharField 's standaard op "" en JSONField 's naar None wanneer u een model instantieert zonder expliciet de waarden voor deze velden door te geven.

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

Daarom, als u een JSONField . wilt maken optioneel, je moet gebruiken:

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

Als u alleen blank=True . gebruikt , zoals u zou doen voor CharField , krijg je een IntegrityError bij het uitvoeren van MyModel.objects.create(...) zonder een json_field . door te geven argument expliciet.



  1. Verbind via clausule om de top van de hiërarchie te krijgen

  2. login mislukt voor gebruiker 'sa'. De gebruiker is niet gekoppeld aan een vertrouwde SQL Server-verbinding. (Microsoft SQL Server, fout:18452) in sql 2008

  3. Schakel het uitvoeren van meerdere instructies in tijdens de uitvoering via sqlalchemy

  4. Moet ik !=of ​​<> gebruiken voor niet gelijk in T-SQL?