From 1a38b3dac48b7890a4db5280da94614042637986 Mon Sep 17 00:00:00 2001 From: Diogo Date: Tue, 19 Oct 2021 14:20:59 +0100 Subject: [PATCH] Render FK values inside resource list view --- fastapi_admin/routes/resources.py | 34 ++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/fastapi_admin/routes/resources.py b/fastapi_admin/routes/resources.py index 14e08cb..2e64b66 100644 --- a/fastapi_admin/routes/resources.py +++ b/fastapi_admin/routes/resources.py @@ -28,8 +28,11 @@ async def list_view( ): fields_label = model_resource.get_fields_label() fields = model_resource.get_fields() + fk_fields = model_resource.get_fk_field() qs = model.all() - params, qs = await model_resource.resolve_query_params(request, dict(request.query_params), qs) + params, qs = await model_resource.resolve_query_params( + request, dict(request.query_params), qs + ) filters = await model_resource.get_filters(request, params) total = await qs.count() if page_size: @@ -37,10 +40,23 @@ async def list_view( else: page_size = model_resource.page_size qs = qs.offset((page_num - 1) * page_size) - values = await qs.values() - rendered_values, row_attributes, column_attributes, cell_attributes = await render_values( - request, model_resource, fields, values - ) + if fk_fields: + objects = await qs.select_related(*fk_fields) + values = [] + for obj in objects: + obj_as_dict = dict(obj) + for attr in fk_fields: + obj_as_dict[attr] = getattr(obj, attr) + values.append(obj_as_dict) + else: + values = await qs.values() + + ( + rendered_values, + row_attributes, + column_attributes, + cell_attributes, + ) = await render_values(request, model_resource, fields, values) context = { "request": request, "resources": resources, @@ -241,10 +257,14 @@ async def create( @router.delete("/{resource}/delete/{pk}") async def delete(request: Request, pk: str, model: Model = Depends(get_model)): await model.filter(pk=pk).delete() - return RedirectResponse(url=request.headers.get("referer"), status_code=HTTP_303_SEE_OTHER) + return RedirectResponse( + url=request.headers.get("referer"), status_code=HTTP_303_SEE_OTHER + ) @router.delete("/{resource}/delete") async def bulk_delete(request: Request, ids: str, model: Model = Depends(get_model)): await model.filter(pk__in=ids.split(",")).delete() - return RedirectResponse(url=request.headers.get("referer"), status_code=HTTP_303_SEE_OTHER) + return RedirectResponse( + url=request.headers.get("referer"), status_code=HTTP_303_SEE_OTHER + )