2011-04-25 40 views
12

这次我认为这不是我愚蠢,而是一个实际的冲突。我有以下代码(简化版):使用继承和外键时Django syncdb冲突related_name

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

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

任何帮助都非常赞赏!

(如果任何人都可以用,为什么错误信息是不是在代码框中发表评论我要解决这个问题。)

+1

发现我自己再次通过谷歌的问题。发生超过我想承认的事情。 – Mark 2012-12-18 00:29:16

回答

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") 

祝你好运......

+0

感谢您的回复,希望能帮助更多人找到解决方案! – Mark 2011-09-16 18:36:20

+0

如果我有两个具有相同应用程序标签的外键,该怎么办?我无法找到答案。 – 2017-07-12 05:16:44

+0

'related_name'只是一个带有关键字'app_label'和'class'的模板化字符串。如果需要,您可以将第一个foreign_key的'related_name'指定为''%(app_label)s _%(class)s_fk1_set“,将第二个foreign_key的'related_name'指定为''%(app_label)s _%(class)s_fk2_set”'您选择的任何其他字符串) – banerjs 2017-07-13 18:38:39