首页 > 代码库 > django中抽象基类的Foreignkey的定义
django中抽象基类的Foreignkey的定义
class base(models.Model): user = models.ForeignKey(User) class Meta: abstract =True
以上是抽象基类的定义,只有一个公用字段user,
class A(base): applier = models.ForeignKey(User)
那么是会报错的,如下:
CommandError: One or more models did not validate:Core.a: Accessor for field ‘user‘ clashes with related field ‘User.a_set‘. Add a related_name argument to the definition for ‘user‘.Core.a: Accessor for field ‘applier‘ clashes with related field ‘User.a_set‘. Add a related_name argument to the definition for ‘applier‘.
简单的翻译就是:A类的对象有两个关联字段指向同一个User类。且关联名字相同,都是 a_set
解决方法就是避免冲突。默认情况下,关联对象的命名是小写的对象名加上‘_set‘。 因此显示指定related_name才能解决此问题。
方法一, 在子类中的相关引用到同一个类的字段里面,添加related_name属性,如下:
class A(base): applier = models.ForeignKey(User, related_name=‘some_other_set‘)
但这样动作量太大(每个子类都要修改),因此最好在抽象基类中添加灵活的支持,如下:
方法二:
class base(models.Model): user = models.ForeignKey(User, related_name = ‘base_%(app_label)s_%(class)s‘) class Meta: abstract =True
这样也不一定能100%避免命名冲突。如果子类有其他字段正好为ForeignKey到User,且其related_name属性设置为了 ‘base_%(app_label)s_%(class)s‘一样会出现问题,不过概率极小。
注意下,app_label从1.7以后貌似不再支持。
django中抽象基类的Foreignkey的定义
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。