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

 

posted @ 2015-01-04 17:07  tommy.yu  阅读(420)  评论(0编辑  收藏  举报