【问题标题】:Django ForeignKey in abstract model class and multiple drived classes causes name clash抽象模型类和多个驱动类中的 Django ForeignKey 导致名称冲突
【发布时间】:2015-07-30 14:11:47
【问题描述】:

我定义了一个抽象类,它有一个ForeignKey。我有多个派生模型类,但是当我尝试生成架构迁移脚本时,南向我显示了一个错误。

class BlogEntryBase(models.Model):
    author = models.CharField(null=True, blank=True, max_length=100)
    title = models.CharField(null=True, blank=True, max_length=255)
    created_by = models.ForeignKey("main.UserProfile", verbose_name="Created By", related_name="%(class)s_set", blank=False, null=False)

class CatBlogEntry(BlogEntryBase):
    pass

class DogBlogEntry(BlogEntryBase):
    pass

错误信息:

animal.catblogentry: Accessor for field 'created_by' clashes with related field 'UserProfile.catblogentry_set'. Add a related_name argument to the definition for 'created_by'.
animal.catblogentry: Reverse query name for field 'created_by' clashes with related field 'UserProfile.catblogentry_set'. Add a related_name argument to the definition for 'created_by'.
animal.dogblogentry: Accessor for field 'created_by' clashes with related field 'UserProfile.dogblogentry_set'. Add a related_name argument to the definition for 'created_by'.
animal.dogblogentry: Reverse query name for field 'created_by' clashes with related field 'UserProfile.dogblogentry_set'. Add a related_name argument to the definition for 'created_by'.

如您所见,我已经指定了related_name 参数。我想问题是在UserProfile 一侧会有两个集合对象,并且它们以某种方式发生冲突?如您所见,我试图排列相关名称,如"%(class)s",但这还不够。我不想将外键类向上移动到派生类,因为我可能因此不得不重复查看和表单代码。 有人有什么建议吗?我的目标是干燥。将两个博客表分开,但使用通用模板、视图和表单代码处理它们。

注意:"main.UserProfile" 是一个字符串,以避免循环模块依赖。

【问题讨论】:

    标签: python django abstract-class foreign-key-relationship django-south


    【解决方案1】:

    我非常简化了我的示例,以至于我实际上遗漏了错误的原因。我实际上有两个外键,总共有 8 条错误消息。 ForeignKeys 指的是同一个实体,UserProfilecreated_bymodified_by。问题是我用的很简单

    related_name="%(class)s_set"
    

    虽然我需要区分这两个

    related_name="%(class)s_something_unique_set"
    

    像这样:

    class BlogEntryBase(models.Model):
        author = models.CharField(null=True, blank=True, max_length=100)
        title = models.CharField(null=True, blank=True, max_length=255)
        created_by = models.ForeignKey("main.UserProfile", verbose_name="Created By", related_name="%(class)s_created_by_set", blank=False, null=False)
        modified_by = models.ForeignKey("main.UserProfile", verbose_name="Modified By", related_name="%(class)s_modified_by_set", blank=False, null=False)
    
    class CatBlogEntry(BlogEntryBase):
        pass
    
    class DogBlogEntry(BlogEntryBase):
        pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多