Movatterモバイル変換


[0]ホーム

URL:


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

Commitd746fb2

Browse files
committed
add association query support for single record query, only absolute ref path now
1 parentc938d61 commitd746fb2

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":"Arrayquery:user",
40+
"label":"Single recordquery: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
fromuliweb.ormimportModelNotFound
44
fromsqlalchemy.sqlimportand_,or_,not_
55
fromjsonimportloads
6+
fromcollectionsimportOrderedDict
67
importlogging
78
importtraceback
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
exceptExceptionase:
2326
log.error("try to load json but get exception: '%s', request data: %s"%(e,request.data))
2427
returnjson({"code":400,"msg":"not json data in the request"})
@@ -31,6 +34,15 @@ def _apply_vars(self):
3134
ifv:
3235
self.rdict[key[:-1]]=v
3336

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

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp