Djangoで二重にForeignKeyでくるめるときのメモ (models.ForeignKey(ManytoManyField(Model)))
Django by Example - Second Edition: Build powerful real-world applications using Django
- 作者: Antonio Melé
- 出版社/メーカー: Packt Publishing
- 発売日: 2018/05/09
- メディア: Kindle版
- この商品を含むブログを見る
メモ
こういうトリッキー・・・というほどでもないですけど、2重にモデルを継承すると、しかもそのひとつは多対多テーブルという。これをDjangoが耐えれるのか?と半信半疑ならがらなんとかローカルでは動いたので、その時のメモです。
動いたモデル構成
は、こんな感じです。
class TagCategory(models.Model): category_name = models.CharField(max_length=255) pubdate = models.DateTimeField(auto_now_add=True) def __str__(self): return self.category_name class TagManytoManyGroup(models.Model): first_category = models.ManyToManyField(TagCategory, blank=True) pubdate = models.DateTimeField(auto_now_add=True) class NewsManytoMany(models.Model): title = models.CharField(max_length=20) text = models.TextField(null=True) tag_info = models.ForeignKey(TagManytoManyGroup, blank=True, null=True, on_delete=models.SET_NULL) timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) def __unicode__(self): return self.title def __unicode__(self): return self.text
エラーになる場合。モデル構成
は、一番最後にForeignKeyでくるむモデルが最上部にあると、定義されてないってエラーがマイグレーション時にでましたので、注意。
#tag_info の定義モデル部分が下に #配置されていると呼び込めない模様。 class NewsManytoMany(models.Model): title = models.CharField(max_length=20) text = models.TextField(null=True) #↓この部分がポイント tag_info = models.ForeignKey(TagManytoManyGroup, blank=True, null=True, on_delete=models.SET_NULL) timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) def __unicode__(self): return self.title def __unicode__(self): return self.text class TagCategory(models.Model): category_name = models.CharField(max_length=255) pubdate = models.DateTimeField(auto_now_add=True) def __str__(self): return self.category_name class TagManytoManyGroup(models.Model): first_category = models.ManyToManyField(TagCategory, blank=True) pubdate = models.DateTimeField(auto_now_add=True)
ちょっと気になること
あとローカルで動くと言えば動くけど、ローカルサーバーでエラーが出ながら動いたりしたので、ちょっと心配ではある・・・ カテゴリーが1,2,3,4,5とあったときに、大カテゴリーで1,3,5だけ選んだモデルを選んだときだけsplitなんとかんとかというエラーが出た、1,2,3,4,5と全部選んだ場合はすんなり動く、なので、splitがクエリ生成時になんかできないとかいうことか??と思いきや。そのあとに1,3,5だけ選んだものを動かしてもエラーがでなくなった、なんで??苦笑