Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d746fb2

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /