文書操作
Djangoの管理画面までちょっと近づいた
モデルに必要な基本的なフィールドを作る
ブックマークアプリを自分でも作ってみるシリーズ。
前回で準備が整ったのでモデルを定義していきます。
モデルの定義はアプリケーションのディレクトリ内(今回の場合はbookmarksディレクトリ)のmodels.pyを編集することで行います。モデルはPythonのクラスとして表現され、その中身はだいたい大枠としてこんな感じになる予感がします:
class クラス名(models.Model):
………
def __str__():
………
class Admin():
………
class Meta():
………
ちなみに__str__、Admin、Metaについては主に管理画面用の設定です。これらを設定すると管理画面がぐっと見やすく使いやすくなります。
これらのモデルに基づいたデータベーステーブルを生成するためには、プロジェクトディレクトリ内(manage.pyがあるディレクトリ:今回の場合はmybookmarksディレクトリ)で
manage.py syncdb
とします。
以後、モデルの具体的な内容が固まるまで
- models.pyの編集
- manage.py syncdb
を繰り返しながら試行錯誤することになるのかな。
今回はとりあえず管理画面に関係しない部分(__str__、Admin、Meta以外の部分)を作っていこうと思います。
ブックマークアプリに必要なテーブルを考える
定義する前にどのようなものをデータベースに格納するのかを考えてまとめておきたいと思います。今回はタグ付きのブックマークアプリを作ろうというわけですから、ブックマークテーブルおよびタグテーブルの2つを定義することにします(実際にはリレーションのためのテーブルも生成されます)。
まずはブックマークテーブルから考えてみます。
例えばFirefoxのブックマークのプロパティには以下のような項目が存在します。
- 名前
- URL
- キーワード
- 説明
この中にあるキーワードというのはいわゆるタグとは別物ですが、設定項目としてはこれにならえばいいのではないかと思います。また例えばdel.icio.usなどにはそのブックマークを登録した日付も記録されていますので、日付も追加することにします。
というわけで、ブックマークテーブルには以下のフィールドを保存することにします。
- 名前
- URL
- 説明
- タグ(下記のタグテーブルとリレーションを張る)
- 日付
さて次にタグテーブルの方ですが、こちらは簡単すませてしまいましょう。
タグテーブルには以下のフィールドを保存することにします。
- 名前
- 説明
一点だけ注意すべきなのはブックマークテーブルの方でリレーションを張っている部分です。リレーションには一対一、一対多、多対多などいろいろありますが、ここでは多対多の関係になります。ブックマークの「タグ」項目には複数のタグが入りますし、あるタグが付与されているブックマークも複数あるからです。
もちろんブックマークテーブルのフィールドとして
- 名前
- URL
- 説明
- 日付
を設定し、タグテーブルのフィールドとして
- 名前
- 説明
- ブックマーク(ブックマークテーブルとリレーションを張る)
を設定してもよいのですが、実際に管理画面で、あるブックマークを今まさに追加しようとするときを考えてみると、「このブックマークにつけるタグはAとBとCだからぁ、まずAタグの編集画面を開いてぇ、このブックマークの名前とURLと説明を記入してぇ、次にBタグにも同じように登録してぇ、次にCタグにも(ry…」というふうに登録することはまずありえないでしょう(めんどくさすぎ)。むしろブックマーク編集画面でブックマーク追加時にタグA、B、Cを付与する方がとても自然です。すなわち、タグテーブルの中にブックマークフィールドがあるよりも、ブックマークテーブルの中にタグフィールドがある方がよいということになります。
*Djangoでは多対多のリレーションを張るには、共通項目を持つテーブルの「片方にだけ」リレーションのためのフィールドをセットします。
クラスとアトリビュート
モデルはPythonのクラスとして定義します。例えばブックマークのテーブルを作成するには:
class Bookmark(models.Model):
などとします。models.Modelを継承します。
各モデルのフィールドはPythonのクラスのアトリビュートとして定義します。どんなフィールドが定義できるのかは増田さんのドキュメントのモデルAPIリファレンスを参照するとよいでしょう。例えば上述のブックマークテーブルでは名前、URL、説明、タグ、日付というフィールドを設定しますので
- 名前は短めの文字列になるだろうから「CharField」
- URLはURLだから「URLField」
- 説明はちょっと長めにして「TextField」(CharFieldでもOKだと思う)
- タグは多対多のリレーションを張るフィールドだから「ManyToManyField」
- 日付は日付だから「DateField」
という感じでアトリビュートを追加してやるとよいと思われます。
フィールドの書式は以下のような感じになるようです。
フィールド名 = models.フィールドの種類(オプション等)
すなわち名前、URL、説明、タグ、日付というフィールドを持ったブックマークテーブルを生成するためには:
class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag)
date = models.DateField(auto_now = True)
オプションは、まぁ、適当にドキュメントを参照しながら。
*リレーションを張るフィールド名には、リレーション先のモデル名の複数形を使うことが推奨されています。今回の場合はリレーション先モデルが「Tag」ですので「tags」としています。
ということで同じようにしてタグモデルも定義します。タグテーブルには名前と簡単な説明のためのフィールドを設定したいので以下のようにします:
class Tag(models.Model):
title = models.CharField(maxlength = 30)
summary = models.CharField(maxlength = 100, blank = True)
とりあえずモデルができたーヾ( ´( ェ )`)ノ
ここまででmodels.pyはこんな風になってます。
# coding : utf-8
from django.db import models
class Bookmark(models.Model):
title = models.CharField(maxlength = 30)
url = models.URLField(unique = True)
summary = models.TextField(maxlength = 200, blank = True)
tags = models.ManyToManyField(Tag)
date = models.DateField(auto_now = True)
class Tag(models.Model):
title = models.CharField(maxlength = 30)
summary = models.CharField(maxlength = 100, blank = True)
ここでプロジェクトディレクトリ内で「manage.py syncdb」すれば勝手にデータベースが生成されるみたい。ただし1回目だけは「スーパーユーザ作る?」って尋ねられるので「yes」と答えておきましょう(2回目以降は尋ねられません)。
先にも述べたように、今後は「モデルの編集→manage.py syncdb→モデルの編集→mana(ry」というサイクルでモデルを作り込んでいくことになろうと思われます。
- カテゴリ
- Django
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://nagosui.org:8080/Nagosui/COREBlog2/ready-for-django-admin-2/tbping

