MawaLog

一日一日を大切に、楽しく生きる。技術と音楽が好き。

Djangoで二重にForeignKeyでくるめるときのメモ (models.ForeignKey(ManytoManyField(Model)))

Django by Example - Second Edition: Build powerful real-world applications using Django

Django by Example - Second Edition: Build powerful real-world applications using Django

メモ

こういうトリッキー・・・というほどでもないですけど、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だけ選んだものを動かしてもエラーがでなくなった、なんで??苦笑