ブログサイトを作ろうとして、modelをこんな感じで作った。
from django.db import models class Post(models.Model): contents = models.TextField(max_length=5000) post_date = models.DateTimeField('date published') class Tag(models.Model): tag_name = models.CharField(max_length=200) post = models.ManyToManyField(Post)
分かる人はわかると思うが、これじゃダメだ。これではPost
がManyで、Tag
がOneになっている。
やりたいことはOneToMany(Post
がOneで、Tag
がMany)だ。
ということで修正する。
from django.db import models class Tag(models.Model): tag_name = models.CharField(max_length=200) class Post(models.Model): contents = models.TextField(max_length=5000) post_date = models.DateTimeField('date published') tag_name = models.ManyToManyField(Tag)
(なぜか宣言順によみこむようになっているので、Post -> Tagの順で書くとエラーになるのでひっくり返した)
っつこーとで、sqlを反映させる。
$ $ python manage.py migrate Operations to perform: Apply all migrations: contenttypes, auth, admin, posts, sessions Running migrations: No migrations to apply. Your models have changes that are not yet reflected in a migration, and so won't be applied. Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
!?
エラーがでた。
ぐぐってみると、まずはファイルを作成してから、migrationを実行しなさいとのこと。
$ python manage.py makemigrations posts Migrations for 'posts': 0002_auto_20160109_2157.py: - Remove field post from tag - Add field tag_name to post $ python manage.py migrate Operations to perform: Apply all migrations: contenttypes, sessions, posts, auth, admin Running migrations: Rendering model states... DONE Applying posts.0002_auto_20160109_2157... OK
この順番で進めたらできた。
なるほど。わかりやすい。
しかし、簡単に管理画面ができた。これすごい。