ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

Djangoのチュートリアル中にマイグレーションでエラー

スポンサードリンク

ブログサイトを作ろうとして、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

この順番で進めたらできた。

なるほど。わかりやすい。

しかし、簡単に管理画面ができた。これすごい。