Navigation

Related Articles

Back to Latest Articles

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 / Djangoを中心にウェブアプリケーションを開発している株式会社ファントムが運営しています。

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




Show Comments (0)

Comments

Related Articles

Django

DjangoのFormに初期値を設定する

DjangoのFormに初期値を設定する Djangoで生成したFormをhiddenにしたまま、あらかじめ設定しておいた初期値が入ったvalueをPOSTする方法です。 forms.pyでinitial=’ […]

Posted on by press
Django

DjangoでQuerySetをpandasのDataFrameに変換する

DjangoでQuerySetで取得したデータをそのままpandasのDataFrameに変換する方法です。データを成形する必要がないときや、とりあえず全件CSV化したいときなどに便利な方法です。

Posted on by press