LoginSignup
3
2

More than 5 years have passed since last update.

【メモ書き】Djangoのmodelクラスを定義する時に、__unicode__が必要な意義

Posted at

背景

Djangoの練習でブログを作ってるんですが、以下のようなモデルを教科書に従って定義した。その時unicodeのところの意義がいまいち分からなかったのでまとめ

class Blog(models.Model):
    title = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique =True)
    body = models.TextField()
    posted = models.DateField(db_index=True,auto_now_add=True)
    category = models.ForeignKey('blog.Category')

    def __unicode__(self):
        return '%s' % self.title

unicodeとは?

多くの人が知っている(らしい)のですが、もちろん初心者の僕は知りません。僕は自称「ググるカス」なので、カスはカスらしくググりました。

unicodeは何百万種類もある言語をコンピューターで統一的に扱うための手段の1つ。

コンピューターが自然言語を理解するための方法はたくさんあって、例を出すと、

  • utf8
  • ASCII

とからしい。

で、これらの方法ではencodeっていうコンピューターが理解できるための1工夫みたいなのをしているんだけど、どうもそれがそれぞれの方法によって違うらしい。

で、もちろん普通のpythonで文字列を扱えばencodeされるんだけど、webで読む人のバックグラウンドがたくさんあって、しかもそれぞれ異なる方法を使ってコンピューターと自然言語でやりとりが行われているので、読む人の環境によってめちゃくちゃなことになるらしい。

もう少し詳しく

例えば、文字AをASCIIによってencodeしてコンピューターで保管しておくとする。そんで、呼び出す人の環境がutf-8の場合どうなるのかを考えてみる。

文字A → ASCII → 文字コード = 123456

といったコードで保存されているとする。

で、呼び出す人の環境がutf-8だとすると、、、

文字コード = 123456 → utf-8 → 文字B

といった感じで異なる文字列が帰ってくる。もじくは同一の文字列が存在しなくって、webページ全体が??????????????ってなったりする。

unicodeの問題点とは?

ここまで来て「全ての文字コードをunicodeで扱えばいいじゃん?」と思ったんだけど、そこまで世の中都合よくいかないらしい。天は2物を与えるときもあるだろうけど、どうやら人間の世界はいつもトレードオフっぽい。

unicodeはコンピューターにとっての統一規格である能力を得たかわりに、人間に見せるための機能を放棄した

っぽい。というか、そうじゃなければ辻褄が合わないので、暫定そうやって理解しておくことにした。(なのでタイトルがメモ書きなのです。)

Djangoでは文字コードはどのように扱われている?

Djangoに話を戻す。

Djangoでは、framework内では全ての情報がunicodeでやりとりされているようだ。で、unicodeは人間に見せる際に少しサボるので、そこを修正してあげるために、modelのところに unicodeと書く必要があるんだとか。

とりあえず、突っ込みどころ満載な状況で記事が終わっているんだけど、そこはとりあえず1段落して前に進むことにする。

知るべき必要のあることはいずれわかる(はず)

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2