[英]Foreign Key in Django model
这里是我的情况: SubCategory
有外键的Topic
和Topic
有外键SubCategory
。
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.
谁能告诉我如何解决它?
将Topic
放在引号中: "Topic"
last_topic = models.ForeignKey("Topic", related_name='+')
或者将Topic
类放在SubCategory
类之上
您的问题是在Subcategory之后声明Topic,因此在定义Subcategory时它不可用。
Python没有部分类声明或前向声明。 但是你可以使用init方法来实现类似的东西。 详情请见此处 。
尝试用引号括起模型:
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='+')
您的问题有几种解决方案:您可以通过related_name
ForeignKey
属性定义后引用,从SubCategory
到Topic
,或者只是将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='+')
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.