Skip to content

Instantly share code, notes, and snippets.

@pvsune
Created November 25, 2019 07:44
Show Gist options
  • Save pvsune/2e5f9f9ae356d0bff633d896bc7d168b to your computer and use it in GitHub Desktop.
Save pvsune/2e5f9f9ae356d0bff633d896bc7d168b to your computer and use it in GitHub Desktop.
Django custom Model fields to implement PostgreSQL specific fields in SQLite
import json
from django.conf import settings
from django.contrib.postgres.fields import (
JSONField as DjangoJSONField,
ArrayField as DjangoArrayField,
)
from django.db.models import Field
class JSONField(DjangoJSONField):
pass
class ArrayField(DjangoArrayField):
pass
if 'sqlite' in settings.DATABASES['default']['ENGINE']:
class JSONField(Field):
def db_type(self, connection):
return 'text'
def from_db_value(self, value, expression, connection):
if value is not None:
return self.to_python(value)
return value
def to_python(self, value):
if value is not None:
try:
return json.loads(value)
except (TypeError, ValueError):
return value
return value
def get_prep_value(self, value):
if value is not None:
return str(json.dumps(value))
return value
def value_to_string(self, obj):
return self.value_from_object(obj)
class ArrayField(JSONField):
def __init__(self, base_field, size=None, **kwargs):
"""Care for DjanroArrayField's kwargs."""
self.base_field = base_field
self.size = size
return super().__init__(**kwargs)
def deconstruct(self):
"""Need to create migrations properly."""
name, path, args, kwargs = super().deconstruct()
kwargs.update({
'base_field': self.base_field.clone(),
'size': self.size,
})
return name, path, args, kwargs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment