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以后貌似不再支持。