當有一個 request 的是 /api/v3/banners/?zones=tw-app-feature-1,tw-app-feature-5,tw-app-feature-3,tw-app-feature-4,tw-app-feature-2
必須符合 query string 的順序時,這邊有實作 ORM 和 MySQL built-in function 兩種處理方式,可供提供比較。
這邊先講結論:使用 ORM 擁有較高的 python 可讀性,畢竟是用 python 描述;而使用 MySQL built-in function 得要做字串併接,可讀性不高。
ORM
order by 填入 case then
:
1 | preserved = Case(*[When(zone__slug=zone, then=index) for index, zone in enumerate(zone_list)]) |
1 | SELECT |
MySQL built-in function
使用 MySQL built-in function 的 FIELD
:
1 | field_func_args = ['{}.{}'.format(Zone._meta.db_table, 'slug'), ] + ['\'{}\''.format(zone) for zone in zone_list] |
1 | SELECT |
結論
兩者相比的話:
- 調用
FIELD
時,queryset
在輸出 SQL 語句會可讀性好很多;但缺點是 Python 要處理成
SQL 語句的 string 時會比較費工夫,閱讀性比較差。 order by 填入 case then
在 Python 和 SQL 語句輸出會比較直覺、簡單許多。