我正在为博客应用程序整理模型。
以下是模型:
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文件中定义它。我错过了什么?
答案 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 relations(ForeignKey
和ManyToManyField
)。
答案 1 :(得分:0)
回答before,你在实际定义之前引用了一个模型(Post) - Python文件中的定义顺序很重要。
要解决这个问题,让Django解析该名称而不是Python,将其用单引号括起来:
posts = models.ManyToManyField('Post')