【问题标题】:Django inherited models foreign key clashDjango继承模型外键冲突
【发布时间】:2019-01-10 12:16:19
【问题描述】:

我正在制作一个像 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) 文件“/home/emre/anaconda3/lib/python3.6/site-packages/django/core/management/commands/runserver.py”,第 117 行,inner_run self.check(display_num_errors=True) 检查文件“/home/emre/anaconda3/lib/python3.6/site-packages/django/core/management/base.py”,第 425 行 引发 SystemCheckError(味精) django.core.management.base.SystemCheckError: SystemCheckError: 系统检查发现一些问题:

错误: medicus_website.Answer.case:(models.E006)字段“case”与模型“medicus_website.post”中的字段“case”冲突。

系统检查发现 1 个问题(0 个已静音)。

【问题讨论】:

    标签: python django-models


    【解决方案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) 
    

    【讨论】:

    • 其实 Post 本身就是一个不同的表。案例和答案源自带有附加字段的 Post。答案取决于案例。我不是 django 专家,所以只是从数据库的角度谈。
    • 好吧,不知何故,我设法混淆了您示例中的继承顺序。我更新了答案。
    猜你喜欢
    • 2010-11-10
    • 2022-10-24
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2013-11-09
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多