Djangoで日本語文字列のQuerySetを五十音順でソートする


press
Djangoで日本語文字列のQuerySetを五十音順でソートする

DjangoのWEBアプリケーションでQuerySetの表示順を五十音順にしたら、開発環境では五十音順で表示されているのに本番環境では五十音順になっていないときの対処法です。(中途半端に五十音順になっていて、4、5件毎に五十音順に表示されていることが多い)

五十音順にならない原因は、開発環境ではSQLite、本番環境ではPostgreSQLという異なるデータベースを使用しており、PostgreSQLはデフォルトでCOLLATEの設定がen_US.UTF-8になっているためで、この状態ではソートをかけても五十音順になりません。COLLATEの設定を変更することで、PostgreSQLでも五十音順で表示することができます。

まず始めにDjangoのディレクトリで以下を実行します。

python manage.py dbshell

現在のテーブル情報を確認します。今回はサンプルとしてテーブル名をguestとしています。

DATABASE=> \d guest

テーブル情報が表示されます。Collationが空欄となっており、何も指定されていません。

                                         Table "public.guest"
     Column      |           Type           | Collation | Nullable |             Default
-----------------+--------------------------+-----------+----------+----------------------------------
 id              | integer                  |           | not null | nextval('guest_id_seq'::regclass)
 firstName       | character varying(10)    |           |          |
 firstNameKana   | character varying(10)    |           |          |
 lastName        | character varying(10)    |           |          |
 lastNameKana    | character varying(10)    |           |          |

以下のコマンドでデフォルトのCOLLATEがどのように設定されているか確認できます。

DATABASE=> SHOW LC_COLLATE;

COLLATEの設定を変更します。

DATABASE=> ALTER TABLE guest ALTER COLUMN "lastNameKana" TYPE VARCHAR COLLATE "C";

大文字が含まれている時は””で囲まないと小文字に変換されてしまいエラーになります。

COLLATEの設定が更新されたかテーブル情報を確認します。

DATABASE=> \d gest

Collationの欄に”C”が表示され更新されたのが確認できます。

                                         Table "public.guest"
     Column      |           Type           | Collation | Nullable |             Default
-----------------+--------------------------+-----------+----------+----------------------------------
 id              | integer                  |           | not null | nextval('guest_id_seq'::regclass)
 firstName       | character varying(10)    |           |          |
 firstNameKana   | character varying(10)    |           |          |
 lastName        | character varying(10)    |           |          |
 lastNameKana    | character varying        | C         |          |

これで日本語文字列を五十音順に表示することができます。

COLLATEの設定を更新する際に、COLLATE の後ろを”ja_JP.UTF-8″;とすると以下のエラーが出たので今回は”C”にしています。

ERROR: collation "ja_JP.utf8" for encoding "UTF8" does not exist

株式会社ファントムへのお問い合わせ

群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。




    Show Comments (0)

    Comments

    Related Articles

    AWS

    AWS LambdaとS3、SNSでファイルのアップロードを自動通知

    AWS LambdaとS3、SNSでファイルのアップロードを自動通知 AWS Lambdaは特定の条件を満たすときにサーバーレスでPython(他のプログラミング言語も)を実行できるサービスです。トリガーを検知したときや […]

    Posted on by press
    Python

    PytorchのDataloaderに関するTips

    Posted on by EIGHT

    最新情報をお届けします!

    メーリングリストに登録するとファントムの最新情報をお届けします

    お客様のメールアドレスを共有することはありません