我想在 Django 中使用 Postgresql 特定的JSONField,但是,我还没有找到使用 sqlite 环境进行测试的方法。
优雅方式的任何提示?
我想在 Django 中使用 Postgresql 特定的JSONField,但是,我还没有找到使用 sqlite 环境进行测试的方法。
优雅方式的任何提示?
如果您使用的是 Django3.1,则可以使用 JSON1 扩展。如果您运行的 Django 版本低于 3.1,下面的代码可能会有所帮助:
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
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
在您的项目中从此文件中导入 JSONField,它将针对 SQLite 和 PostgreSQL 进行自我调整。