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だけ選んだものを動かしてもエラーがでなくなった、なんで??苦笑