抽象模型 class 和多个驱动 classes 中的 Django ForeignKey 导致名称冲突
Django ForeignKey in abstract model class and multiple drived classes causes name clash
我定义了一个摘要class,它有一个ForeignKey
。我有多个派生模型 classes,但是当我尝试生成模式迁移脚本时,south 向我显示错误。
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
一侧会有两个 set 对象,它们会以某种方式发生冲突?如您所见,我尝试排列 "%(class)s"
等相关名称,但这还不够。我不想将外键 class 向上移动到派生的 classes,因为我可能因此不得不重复视图和表单代码。
有人有什么建议吗?我的目标是干。将两个博客表分开,但使用通用模板、视图和表单代码处理它们。
注意:"main.UserProfile"
是一个字符串,以避免循环模块依赖。
我简化了我的示例,以至于我实际上忽略了错误的原因。我实际上有两个外键,总共有 8 条错误消息。 ForeignKeys
指的是同一实体,UserProfile
:created_by
、modified_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
我定义了一个摘要class,它有一个ForeignKey
。我有多个派生模型 classes,但是当我尝试生成模式迁移脚本时,south 向我显示错误。
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
一侧会有两个 set 对象,它们会以某种方式发生冲突?如您所见,我尝试排列 "%(class)s"
等相关名称,但这还不够。我不想将外键 class 向上移动到派生的 classes,因为我可能因此不得不重复视图和表单代码。
有人有什么建议吗?我的目标是干。将两个博客表分开,但使用通用模板、视图和表单代码处理它们。
注意:"main.UserProfile"
是一个字符串,以避免循环模块依赖。
我简化了我的示例,以至于我实际上忽略了错误的原因。我实际上有两个外键,总共有 8 条错误消息。 ForeignKeys
指的是同一实体,UserProfile
:created_by
、modified_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