2013-09-28 58 views
2

这里是我的情况:SubCategoryTopicTopic的外键有SubCategory的外键。Django模式中的外键

class SubCategory(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=110) 
    description = models.TextField(default='') 
    ordering = models.PositiveIntegerField(default=1) 
    category = models.ForeignKey(Category) 
    created_on = models.DateTimeField(auto_now_add=True) 
    created_by = models.ForeignKey(User) 
    updated_on = models.DateTimeField(blank=True, null=True) 
    updated_by = models.ForeignKey(User, related_name='+') 
    num_topics = models.IntegerField(default=0) 
    num_posts = models.IntegerField(default=0) 
    last_topic = models.ForeignKey(Topic, related_name='+') 


class Topic(models.Model): 
    name = models.CharField(max_length=300) 
    slug = models.SlugField(max_length=300) 
    description = models.TextField(default='') 
    subcategory = models.ForeignKey(SubCategory) 
    created_on = models.DateTimeField(auto_now_add=True) 
    created_by = models.ForeignKey(User) 
    updated_on = models.DateTimeField(blank=True, null=True) 
    updated_by = models.ForeignKey(User, related_name='+') 

当我运行这段代码,它提供了以下错误:

NameError: name 'Topic' is not defined. 

任何人能告诉我如何解决它?

回答

0

你的问题是Topic是在子类别之后声明的,因此它在定义子类别时不可用。

Python没有部分类声明或前向声明。但是您可以使用init方法来实现类似的功能。详情请参阅here

+0

语言,如C++有提前声明的特征。 Python有类似的东西吗? –

+0

@Phoenix,不完全是,但可以使用__init__关闭。请参阅编辑。 – papirrin

5

要么把Topic引号:"Topic"

last_topic = models.ForeignKey("Topic", related_name='+') 

或将TopicSubCategory

+0

它解决了我的问题。谢谢 –

+0

我想指出''语法也存在。因此,'auth.User'是一种简单的方法来创建django.contrib.auth.models.User – Delyan

+0

的外键。当您引用的模型不在当前文件中时,这非常有用。此外,当你试图避免循环进口。当模型*在当前文件中*时,您可以放弃应用参考 –

-1

上面有几个解决你的问题:你既可以定义一个反向引用,从SubCategoryTopic通过related_nameForeignKey属性,或者只是将您的ForeignKey模型的名称作为字符串传递。

解决方案1:

class SubCategory(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=110) 
    description = models.TextField(default='') 
    ordering = models.PositiveIntegerField(default=1) 
    ... 
    last_topic = models.ForeignKey(Topic, related_name='subcategory') 

解决方案2:

class SubCategory(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=110) 
    description = models.TextField(default='') 
    ordering = models.PositiveIntegerField(default=1) 
    category = models.ForeignKey(Category) 
    created_on = models.DateTimeField(auto_now_add=True) 
    created_by = models.ForeignKey(User) 
    updated_on = models.DateTimeField(blank=True, null=True) 
    updated_by = models.ForeignKey(User, related_name='+') 
    num_topics = models.IntegerField(default=0) 
    num_posts = models.IntegerField(default=0) 
    last_topic = models.ForeignKey("Topic", related_name='+') 


class Topic(models.Model): 
    name = models.CharField(max_length=300) 
    slug = models.SlugField(max_length=300) 
    description = models.TextField(default='') 
    subcategory = models.ForeignKey(SubCategory) 
    created_on = models.DateTimeField(auto_now_add=True) 
    created_by = models.ForeignKey(User) 
    updated_on = models.DateTimeField(blank=True, null=True) 
    updated_by = models.ForeignKey(User, related_name='+') 

    ... 
0

尝试用引号引起型号:

class SubCategory(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(max_length=110) 
    description = models.TextField(default='') 
    ordering = models.PositiveIntegerField(default=1) 
    category = models.ForeignKey('Category') 
    created_on = models.DateTimeField(auto_now_add=True) 
    created_by = models.ForeignKey('User') 
    updated_on = models.DateTimeField(blank=True, null=True) 
    updated_by = models.ForeignKey('User', related_name='+') 
    num_topics = models.IntegerField(default=0) 
    num_posts = models.IntegerField(default=0) 
    last_topic = models.ForeignKey('Topic', related_name='+') 


class Topic(models.Model): 
    name = models.CharField(max_length=300) 
    slug = models.SlugField(max_length=300) 
    description = models.TextField(default='') 
    subcategory = models.ForeignKey("SubCategory") 
    created_on = models.DateTimeField(auto_now_add=True) 
    created_by = models.ForeignKey('User') 
    updated_on = models.DateTimeField(blank=True, null=True) 
    updated_by = models.ForeignKey('User', related_name='+') 
+0

这就是3年前提出的最佳答案。请保持您的答案有用。 – walen