为什么我的django模型会抛出错误?

时间:2012-10-08 00:52:34

标签: python django-models

我正在为博客应用程序整理模型。

以下是模型:

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文件中定义它。我错过了什么?

2 个答案:

答案 0 :(得分:4)

问题

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

解决方案

因此,改变这一行:

posts = models.ManyToManyField(Post)

进入这一行:

posts = models.ManyToManyField('Post')

说明

The documentation为您提供了解决方法:

  

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

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 argument when defining relationsForeignKeyManyToManyField)。

答案 1 :(得分:0)

回答before,你在实际定义之前引用了一个模型(Post) - Python文件中的定义顺序很重要。

要解决这个问题,让Django解析该名称而不是Python,将其用单引号括起来:

posts = models.ManyToManyField('Post')