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

时间:2011-04-25 15:02:16

标签: 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:字段“关系”的访问者与相关字段“Delta.reverse_relation”冲突。将related_name参数添加到'relation'的定义中     app.beta:字段'relation'冲突的反向查询名称与相关字段'Delta.reverse_relation'冲突。将related_name参数添加到'relation'的定义中     app.gamma:字段'关系'的访问者与相关字段'Delta.reverse_relation'冲突。将related_name参数添加到'relation'的定义中     app.gamma:字段“关系”的反向查询名称与相关字段“Delta.reverse_relation”冲突。将related_name参数添加到'relation'的定义中。

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

任何帮助都非常赞赏!

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

1 个答案:

答案 0 :(得分:21)

我认为您会在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")

祝您好运......