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

我不明白为什么没有定义 Post,因为我在 models.py 文件中定义了它。我错过了什么?

4

2 回答 2

4

问题

定义Tag类时,Post尚未定义类。因为你指的是它,所以你会得到NameError例外。

解决方案

因此,更改此行:

posts = models.ManyToManyField(Post)

进入这一行:

posts = models.ManyToManyField('Post')

解释

该文档为您提供了解决方法:

如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身:

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

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

替代解决方案

您也可以省略类posts中的定义Tag(“ posts = models.ManyToManyField(Post)”行),只为模型中的反向关系提供适当的名称Post。Django 会知道如何处理它。只需替换这一行:

tags = models.ManyToManyField(Tag)

用这条线:

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

要了解更多信息,请阅读related_name定义关系(ForeignKeyManyToManyField) 时的参数。

于 2012-10-08T00:55:59.570 回答
0

如前所述,您在实际定义模型(Post)之前已经引用了它——Python 文件中的定义顺序很重要

为了解决这个问题,让 Django 解析该名称而不是 Python,方法是用单引号括起来:

posts = models.ManyToManyField('Post')

于 2012-10-08T01:00:18.300 回答