-
Notifications
You must be signed in to change notification settings - Fork 1
/
fields.py
39 lines (27 loc) · 940 Bytes
/
fields.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import json
from django.db import models
from django.core import exceptions
class JsonField(models.TextField):
def from_db_value(self, value, expression, connection):
return self.to_python(value)
def to_python(self, value):
if value is None:
return value
if isinstance(value, str):
try:
return json.loads(value)
except ValueError:
raise exceptions.ValidationError(
"'%(value)s' is not valid JSON.",
code='invalid',
params={'value': value},
)
return value
def get_prep_value(self, value):
if value is None:
return None
if isinstance(value, dict):
return json.dumps(value)
if isinstance(value, str):
return value
raise ValueError('JSONField value must be a dict or string')