ブログサイトを作ろうとして、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
この順番で進めたらできた。
なるほど。わかりやすい。
しかし、簡単に管理画面ができた。これすごい。