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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import datetime
import json
import six
import uuid
from django.db import models
from django.apps import apps
from django.http import JsonResponse
from gm_types.utils.enum import EnumMeta
def schema_view(app_label=None, db_table=None):
"""retrieve model schema
"""
modelCls = get_models(app_label, db_table)
schemas = []
for model in modelCls:
schema = {
"app_label": model._meta.app_label,
"db_table": model._meta.db_table,
"fields": [],
}
for field in model._meta.get_fields():
if not field.concrete:
continue
if field.default is models.fields.NOT_PROVIDED:
default = "NOT_PROVIDED"
elif isinstance(field.default, datetime.datetime):
default = field.default.strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(field.default, datetime.time):
default = field.default.strftime("%H:%M:%S")
elif type(field.default) == type(uuid.uuid4):
default = field.default.__name__.upper()
else:
try:
json.dumps(field.default)
default = field.default
except TypeError:
default = "NOT_SERIALIZABLE"
if type(field.choices) == EnumMeta:
choices = [v[0] for v in field.choices]
else:
choices = field.choices
schema["fields"].append({
"name": field.name,
"null": field.null,
"blank": field.blank,
"choices": choices,
"db_column": field.db_column,
"db_index": field.db_index,
"db_tablespace": field.db_tablespace,
"default": default,
"unique": field.unique,
"primary_key": field.primary_key,
"verbose_name": field.verbose_name if isinstance(field.verbose_name, six.string_types) else "",
"help_text": field.help_text if isinstance(field.help_text, six.string_types) else "",
})
json.dumps(schema)
schemas.append(schema)
return schemas
def get_models(app_label=None, db_table=None):
try:
mCls = models.get_models()
if app_label:
f = lambda m: m._meta.app_label == app_label
mCls = filter(f, mCls)
except AttributeError:
if app_label:
mDict = apps.all_models[app_label]
mCls = mDict.values()
else:
mCls = []
for app in apps.all_models:
mCls.extend(list(apps.all_models[app].values()))
if db_table:
f = lambda m: m._meta.db_table == db_table
mCls = filter(f, mCls)
return mCls