Django继承了模型外键冲突

时间:2019-01-10 12:16:19

标签: python django-models

我正在制作一个像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个处于静默状态)。

1 个答案:

答案 0 :(得分:1)

您陷入了Django模型继承的陷阱中。您正在应用Multi-table inheritance,而我假设您正在使用Abstract inheritance

换句话说,您的Post已经有一个case字段-由于您具有从CasePost的多表继承,因此每个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)