Skip to content

Commit d746fb2

Browse files
committed
add association query support for single record query, only absolute ref path now
1 parent c938d61 commit d746fb2

File tree

3 files changed

+70
-11
lines changed

3 files changed

+70
-11
lines changed

demo/apps/apijson_demo/settings.ini

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ comment = 'apijson_demo.models.Comment'
44
moment = 'apijson_demo.models.Moment'
55

66
[APIJSON_MODELS]
7+
user = {
8+
"user_id_field" : "id",
9+
"secret_fields" : ["password"],
10+
"GET" : { "roles" : ["LOGIN","ADMIN","OWNER"] },
11+
"HEAD" : { "roles" : ["LOGIN","ADMIN","OWNER"] },
12+
"POST" : { "roles" : ["ADMIN"] },
13+
"PUT" : { "roles" : ["ADMIN","OWNER"] },
14+
"DELETE" : { "roles" : ["ADMIN"] },
15+
}
716
moment = {
817
"user_id_field" : "user_id",
918
"GET" : { "roles" : ["OWNER","LOGIN","ADMIN"] },

demo/apps/apijson_demo/views.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,24 +30,34 @@ def index():
3030
{
3131
"label":"Single record query: @column",
3232
"value":'''{
33-
"user":{
33+
"user":{
3434
"@column": "id,username,email",
3535
"@role":"OWNER"
36-
}
36+
}
3737
}''',
3838
},
3939
{
40-
"label":"Array query: user",
40+
"label":"Single record query: association query",
4141
"value":'''{
42-
"[]":{
43-
"@count":2,
44-
"@page":0,
42+
"moment":{},
4543
"user":{
46-
"@column":"id,username,nickname,email",
47-
"@order":"id-",
48-
"@role":"ADMIN"
44+
"@column": "id,username,email",
45+
"id@": "moment/user_id"
46+
}
47+
}''',
48+
},
49+
{
50+
"label":"Array query: user",
51+
"value":'''{
52+
"[]":{
53+
"@count":2,
54+
"@page":0,
55+
"user":{
56+
"@column":"id,username,nickname,email",
57+
"@order":"id-",
58+
"@role":"ADMIN"
59+
}
4960
}
50-
}
5161
}''',
5262
},
5363
{
@@ -112,6 +122,21 @@ def index():
112122
"email$":"%local%"
113123
}
114124
}
125+
}''',
126+
},
127+
{
128+
"label":"Array query: association query",
129+
"value":'''{
130+
"[]": {
131+
"moment": {
132+
"@column": "id,date,user_id",
133+
"id": 3
134+
},
135+
"user": {
136+
"id@": "/moment/user_id",
137+
"@column": "id,username"
138+
}
139+
}
115140
}''',
116141
},
117142
]

uliweb_apijson/apijson/views.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from uliweb.orm import ModelNotFound
44
from sqlalchemy.sql import and_, or_, not_
55
from json import loads
6+
from collections import OrderedDict
67
import logging
78
import traceback
89

@@ -18,7 +19,9 @@ def __begin__(self):
1819
self.vars = {}
1920

2021
try:
21-
self.request_data = loads(request.data)
22+
#https://blog.csdn.net/yockie/article/details/44065885
23+
#keep order when parse json, because the order matters for association query
24+
self.request_data = loads(request.data, object_pairs_hook=OrderedDict)
2225
except Exception as e:
2326
log.error("try to load json but get exception: '%s', request data: %s"%(e,request.data))
2427
return json({"code":400,"msg":"not json data in the request"})
@@ -31,6 +34,15 @@ def _apply_vars(self):
3134
if v:
3235
self.rdict[key[:-1]] = v
3336

37+
def _ref_get(self,path):
38+
if path[0]=="/":
39+
#TODO: relative path
40+
pass
41+
else:
42+
#absolute path
43+
m,c = path.split("/")
44+
return self.rdict.get(m,{}).get(c)
45+
3446
def get(self):
3547
try:
3648
for key in self.request_data:
@@ -93,6 +105,19 @@ def _get_one(self,key):
93105

94106
params = self.request_data[key]
95107
if isinstance(params,dict):
108+
#update reference,example: {"id@": "moment/user_id"} -> {"id": 2}
109+
ref_fields = []
110+
refs = {}
111+
for n in params:
112+
if n[-1]=="@":
113+
ref_fields.append(n)
114+
col_name = n[:-1]
115+
path = params[n]
116+
refs[col_name] = self._ref_get(path)
117+
for i in ref_fields:
118+
del params[i]
119+
params.update(refs)
120+
96121
for n in params:
97122
if n[0]=="@":
98123
if n=="@column":

0 commit comments

Comments
 (0)