Preface
Recently, I am using ormar package work with fastapi web framework.
With MySQL statement we can use select id as OrderId from orders
to create an alias for id
filed, in ormar package, I can't find how to create alias when I use query statement. So, I use a foolish operation to solve it(create a dict), but with the increment of query statements, this operation may be bloated.
Is there other operation to solve it?
Code
Here is my code. These codes are not complete, they just show my ideas.
query = MmbfClass.objects.select_related(
[MmbfClass.business_id, MmbfClass.team_id, MmbfClass.unit_id, MmbfClass.place_id]
)
conditions = {
"business_id": partial(MmbfClass.business_id.id.iexact, business_id),
"schedule_name": partial(MmbfClass.schedule_id.schedule_name.iexact, schedule_name),
"team_id": partial(MmbfClass.team_id.id.iexact, team_id),
"unit_id": partial(MmbfClass.unit_id.id.iexact, unit_id),
"place_name": partial(MmbfClass.place_id.place_name.contains, place_name),
"class_name": partial(MmbfClass.class_name.contains, class_name)
}
for key, value in conditions.items():
if locals()[key]:
query = query.filter(value)
before_paginate_count = await query.count()
after_paginate_data = await query.paginate(
page_size=page_size, page=page_num
).values(
ClassInfoTools.class_map.keys()
)
real_result = await ClassInfoTools.convert_mysql_query_to_py_model_for_class(after_paginate_data),
class ClassInfoTools:
class_map = {
"id": "classId",
"business_id__business_name": "businessName",
"team_id__team_name": "teamName",
"unit_id__unit_name": "unitName",
"place_id__place_name": "placeName",
"class_name": "className",
"max_num": "maxNum",
"now_num": "nowNum",
"quota_rule": "quotaRule",
"place_accept": "placeAccept",
"class_merge": "classMerge"
}
@classmethod
async def convert_mysql_query_to_py_model_for_class(cls, mysql_result) -> list[SingleScheduleClassInfo]:
py_model_list = []
# use metaclass or ?
for item in mysql_result:
class_params = {
value: item[key] for key, value in cls.class_map.items()
}
print(class_params)
# first argument is name of class, second is parent class, third is params
class_model_example = SingleScheduleClassInfo(**class_params)
py_model_list.append(class_model_example)
return py_model_list