0

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
ssayno
  • 51
  • 7

0 Answers0