我正在制作一个像stackoverflow这样的问答网站。但是Django模型字段发生冲突。 我正在使用Django2.1.5
我尝试添加related_name = 'answers_case'
,但未做任何更改。
这是我的模特:
class Post(models.Model):
user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
post_date = models.DateTimeField(auto_now_add=True)
score = models.IntegerField(default=0)
body = models.TextField()
last_edit_date = models.DateTimeField(null=True, blank=True)
is_active = models.BooleanField(default=False)
class Case(Post):
title = models.CharField(max_length=150)
slug = models.SlugField(unique=True, max_length=150)
view_count = models.IntegerField(default=0)
keyword = models.ManyToManyField(Keyword)
class Answer(Post):
case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='answers_case')
is_accepted = models.BooleanField(default=False)
错误是:
.wrapper在0x7fa57c42c7b8启动的线程中未处理的异常> 追溯(最近一次通话): 包装中的文件“ /home/emre/anaconda3/lib/python3.6/site-packages/django/utils/autoreload.py”,第225行 fn(* args,** kwargs) 在inner_run中,文件“ /home/emre/anaconda3/lib/python3.6/site-packages/django/core/management/commands/runserver.py”,第117行 self.check(display_num_errors = True) 检查文件“ /home/emre/anaconda3/lib/python3.6/site-packages/django/core/management/base.py”,第425行 引发SystemCheckError(msg) django.core.management.base.SystemCheckError:SystemCheckError:系统检查确定了一些问题:
错误: medicus_website.Answer.case :(模型。E006)字段“ case”与模型“ medicus_website.post”中的“ case”字段发生冲突。
系统检查确定了1个问题(0个处于静默状态)。
答案 0 :(得分:1)
您陷入了Django模型继承的陷阱中。您正在应用Multi-table inheritance,而我假设您正在使用Abstract inheritance。
换句话说,您的Post
已经有一个case
字段-由于您具有从Case
到Post
的多表继承,因此每个Post
可能有相应的Case
,这就是为什么名称有冲突的原因。如果要保持当前行为(就数据库结构和关系构造而言),则必须在回答中重命名Case
模型或case
字段。另一方面,如果您希望切换到抽象继承,并且每个表都具有自己的内容,则可以这样做:
class AbstractPost(models.Model):
user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
post_date = models.DateTimeField(auto_now_add=True)
score = models.IntegerField(default=0)
body = models.TextField()
last_edit_date = models.DateTimeField(null=True, blank=True)
is_active = models.BooleanField(default=False)
class Meta:
abstract = True
class Post(AbstractPost):
# if you need standalone posts
pass
class Case(AbstractPost):
title = models.CharField(max_length=150)
slug = models.SlugField(unique=True, max_length=150)
view_count = models.IntegerField(default=0)
keyword = models.ManyToManyField(Keyword)
class Answer(Post):
case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='answers_case')
is_accepted = models.BooleanField(default=False)