3

ブログアプリのモデルをまとめています。

モデルは次のとおりです。

from django.db import models

class Tag(models.Model):
    keyword = models.CharField(max_length=256)
    posts = models.ManyToManyField(Post)

    def __unicode__(self):
        return self.keyword

class Post(models.Model):
    title = models.CharField(max_length=512)
    image = models.ImageField
    body = models.TextField()
    visible = models.BooleanField()
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    tags = models.ManyToManyField(Tag)

    def __unicode__(self):
        return self.title

ブログ パッケージを settings.py に追加しました。それから私は走りましpython manage.py sql blogた。次のエラーが発生しました。

 File "/pathto/blog/models.py", line 5, in Tag
    posts = models.ManyToManyField(Post)
NameError: name 'Post' is not defined

models.py ファイルで定義しているため、Post が定義されていない理由がわかりません。私は何が欠けていますか?

4

2 に答える 2

4

問題

クラスを定義しているときTagPostクラスはまだ定義されていません。参照しているため、NameError例外が発生します。

解決

したがって、次の行を変更します。

posts = models.ManyToManyField(Post)

この行に:

posts = models.ManyToManyField('Post')

説明

ドキュメントには、回避策が記載されています。

まだ定義されていないモデルに関係を作成する必要がある場合は、モデル オブジェクト自体ではなく、モデルの名前を使用できます。

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer')
    # ...

class Manufacturer(models.Model):
    # ...

代替ソリューション

postsin Tagclassの定義 (行 " ") を省略して、モデルposts = models.ManyToManyField(Post)の逆リレーションに適切な名前を指定することもできます。PostDjango はそれをどうするかを知っています。この行を置き換えるだけです:

tags = models.ManyToManyField(Tag)

この行で:

tags = models.ManyToManyField(Tag, related_name='posts')

related_name詳細については、リレーションを定義する際の引数(ForeignKeyおよび)についてお読みくださいManyToManyField

于 2012-10-08T00:55:59.570 に答える
0

に回答したように、実際に定義する前にモデル (Post) を参照しています。Python ファイルの定義順序は重要です。

この問題を回避するには、名前を単一引用符で囲んで、Python ではなく Django に名前を解決させます。

posts = models.ManyToManyField('Post')

于 2012-10-08T01:00:18.300 に答える