使用继承和外键时,Django syncdb 冲突related_name

标签 django foreign-keys manytomanyfield syncdb

这次我想不是我愚蠢,而是真正的冲突。我有以下代码(简化):

from django.db import models

class Alpha(models.Model):
    relation = models.ForeignKey('Delta', related_name = 'reverse_relation', blank = True, null = True)

    class Meta:
        abstract = True

class Beta(Alpha):
    pass

class Gamma(Alpha):
    pass

class Delta(models.Model):
    pass

问题是 Delta.reverse_relation 可以引用 Beta 的实例或 Gamma 的实例。我必须以某种方式提供多个 related_name 值(或一个取决于类名的值)。我认为问题很清楚但要完整,错误(运行 syncdb 时):
app.beta:字段“relation”的访问器与相关字段“Delta.reverse_relation”发生冲突。将related_name 参数添加到'relation' 的定义中。
app.beta:字段“relation”的反向查询名称与相关字段“Delta.reverse_relation”冲突。将related_name 参数添加到'relation' 的定义中。
app.gamma:字段“relation”的访问器与相关字段“Delta.reverse_relation”发生冲突。将related_name 参数添加到'relation' 的定义中。
app.gamma:字段“relation”的反向查询名称与相关字段“Delta.reverse_relation”冲突。将related_name 参数添加到'relation' 的定义中。

是否有可能将 ForeignKey 放在父 Alpha 中,或者是将此代码剪切粘贴到 Beta 和 Gamma 的唯一方法?我不喜欢这样做,因为如果我不能在父级中定义所有子级共享的一半字段,它会破坏继承的意义。

非常感谢任何帮助!

(如果有人可以评论为什么错误消息不在代码框中,我会解决这个问题。)

最佳答案

我认为您会发现 Django 文档中的以下建议有用且相关:
https://docs.djangoproject.com/en/1.7/topics/db/models/#be-careful-with-related-name

本质上将关系字段的声明更改为:

relation = models.ForeignKey('Delta', related_name="%(app_label)s_%(class)s")

祝你好运...

关于使用继承和外键时,Django syncdb 冲突related_name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779702/

相关文章:

python - 我在 Django 应用程序中的哪里注册 rq-scheduler 作业?

python - 使用 Django + HTML 表单上传文件

mysql - 错误 1452 MySQL

mysql - 如何通过 2 个外键访问同一个表来获取 MySQL 中的信息?

django 为在外键字段模型中创建的新实例自动创建中间模型实例

python - 具有 null=True 的 OneToOneField 不允许空字段

django - 复数形式表达可能很危险

python - SQLAlchemy 外键找不到表

python - 允许在 Python/Django 中重复多对多条目的方法

Django:带有 'through'的InlineAdmin和ManyToManyField