1+ from datetime import datetime
12from typing import List , Optional
23
34from fastapi import APIRouter , Depends
5+ from fastapi .params import Path
46from pydantic import BaseModel
5- from sqlalchemy import delete , func , select
7+ from sqlalchemy import (
8+ DECIMAL ,
9+ INTEGER ,
10+ BigInteger ,
11+ DateTime ,
12+ Float ,
13+ Integer ,
14+ Numeric ,
15+ SmallInteger ,
16+ delete ,
17+ func ,
18+ select ,
19+ )
620from sqlalchemy .orm import Session
721from starlette .requests import Request
822from starlette .responses import RedirectResponse
@@ -41,10 +55,10 @@ def list_view(
4155):
4256 if not user :
4357 return RedirectResponse (request .url_for ("admin:login" ))
44-
45- datas = session . execute (
46- select ( page_model . list_display ). limit ( perPage ). offset (( page - 1 ) * perPage )
47- )
58+ sql = page_model . get_list_sql ()
59+ if sql == None :
60+ return BaseRes ( )
61+ datas = session . execute ( sql . limit ( perPage ). offset (( page - 1 ) * perPage ) )
4862 items = []
4963 for data in datas :
5064 items .append (dict (data ))
@@ -70,7 +84,7 @@ def update_data(
7084):
7185 if not user :
7286 return RedirectResponse (request .url_for ("admin:login" ))
73- data = clean_data_to_model (page_model .update_fields , data )
87+ data = clean_data_to_model (page_model .get_clean_fields ( page_model . update_fields ) , data )
7488 w = get_pks (page_model , request )
7589 if isinstance (w , BaseRes ):
7690 return w
@@ -92,10 +106,10 @@ def update_view(
92106 if not user :
93107 return RedirectResponse (request .url_for ("admin:login" ))
94108
95- w = get_pks (page_model , request )
96- if isinstance (w , BaseRes ):
97- return w
98- data = session .execute (select ( page_model .update_fields ). where ( * w )).fetchone ()
109+ pks = get_pks (page_model , request )
110+ if isinstance (pks , BaseRes ):
111+ return pks
112+ data = session .execute (page_model .get_one_sql ( pks )).fetchone ()
99113 if not data :
100114 return not_found_instance
101115 return BaseRes (data = dict (data ))
@@ -138,12 +152,23 @@ def delete_one(
138152
139153
140154def get_pks (page_model : ModelAdmin , request : Request ):
155+ """
156+ 获取要查询的单个instance的主键
157+ """
141158 params = dict (request .query_params )
142159 pks = get_pk (page_model .model )
143160 w = []
144161 for k , v in params .items ():
145162 if pks .get (k ) is not None :
146- w .append (pks [k ] == v )
163+ field = pks [k ]
164+ if isinstance (
165+ field .type , (Integer , DECIMAL , BigInteger , Float , INTEGER , Numeric , SmallInteger )
166+ ):
167+ w .append (pks [k ] == int (v ))
168+ elif isinstance (field .type , DateTime ):
169+ w .append (pks [k ] == datetime .strptime (v , "%Y-%m-%dT%H:%M:%S" ))
170+ else :
171+ w .append (pks [k ] == v )
147172 else :
148173 return key_error
149174 return w
@@ -173,3 +198,29 @@ def get_schema(
173198 return RedirectResponse (request .url_for ("admin:login" ))
174199
175200 return BaseRes (data = page .get_app_page ())
201+
202+
203+ @router .get ("/{resource}/selects/{field}" )
204+ def get_selects (
205+ request : Request ,
206+ field : str = Path (...), # type: ignore
207+ page_model : ModelAdmin = Depends (get_model_site ),
208+ user : Optional [User ] = Depends (decode_access_token_from_data ),
209+ session : Session = Depends (get_db_session ),
210+ perPage : int = 10 ,
211+ page : int = 1 ,
212+ ):
213+ source_field = getattr (page_model .model , field )
214+ relation_model = source_field .property .mapper .class_
215+
216+ datas = session .execute (
217+ select (list (get_pk (relation_model ).values ())).limit (perPage ).offset ((page - 1 ) * perPage )
218+ )
219+ items = []
220+ for data in datas :
221+ items .append (dict (data ))
222+ s = session .execute (select (func .count ()).select_from (relation_model ))
223+ total = 0
224+ for i in s :
225+ total = i [0 ]
226+ return BaseRes (data = {"total" : total , "rows" : items })
0 commit comments