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的定义的更多相关文章

  1. Python中的对象行为与特殊方法(二)类型检查与抽象基类

    类型检查 创建类的实例时,该实例的类型为类本身: class Foo(object): pass f = Foo() 要测试实例是否属于某个类,可以使用type()内置函数: >>> ...

  2. Python中的抽象基类

    1.说在前头 "抽象基类"这个词可能听着比较"深奥",其实"基类"就是"父类","抽象"就是&quo ...

  3. 流畅python学习笔记:第十一章:抽象基类

    __getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...

  4. Python高级主题:Python ABC(抽象基类)

    #抽象类实例 作用统一规范接口,降低使用复杂度.import abcclass Animal(metaclass = abc.ABCMeta): ##只能被继承,不能实例化,实例化会报错 @abc.a ...

  5. 流畅的python学习笔记:第十一章:抽象基类

    __getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克 ...

  6. Python抽象基类之声明协议

    抽象基类之--声明协议 上回讲了Python中抽象基类的大概,相信大家对abcmeta以及什么是抽象基类已经有所了解.传送门 现在我们来讲讲抽象基类的另一个常用用法--声明协议 所谓声明协议,有点像J ...

  7. django abstract base class ---- 抽象基类

    抽象蕨类用于定义一些同享的列.类本身并不会在数据库端有表与之对应 一.例子: 1.定义一个叫Person 的抽象基类.Student 继承自Person from django.db import m ...

  8. C++中的抽象基类示例

    抽象基类(abstract base class,ABC)例子:圆与椭圆.建立一个基类BaseEllipse,建立它的恋歌继承了Ellipse和Circle.ellipse.h #ifndef ELL ...

  9. Djiango-建立模型抽象基类

    创建一个抽象模型基类 ‘ 然后 ’base_model.py from django.db import models from datetime import date class BaseMode ...

随机推荐

  1. LaTex 使用 - 配置

    Reference Link: http://www.howtotex.com/howto/installing-latex-on-windows/ MikTeX:http://miktex.org/ ...

  2. Object.ReferenceEquals

    https://msdn.microsoft.com/en-us/library/system.object.referenceequals(v=vs.110).aspx However, the r ...

  3. 将当前网址生成快捷方式在桌面(仅支持IE)

    //安装到桌面function toDesktop(sUrl,sName){ try { var WshShell = new ActiveXObject("WScript.Shell&qu ...

  4. centos 7.0安装花生壳

    没有wget 先下载get  命令 yum -y install wget 下载位置/usr/local/src 解压目录 /usr/local/bin/phddns-2.0.6.x86_64 1.下 ...

  5. C# 正则分组捕获

    分组语法 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp ...

  6. 修改ubuntu DNS的步骤/wget url报错: unable to resolve host address的解决方法

    wget url 报错:unable to resolve host address ‘url’,显然是无法解析主机地址,这就能看出是DNS解析的问题.解决办法就是配置可用的dns 一般是修改成为谷歌 ...

  7. javascript 时间处理

    <script language="JavaScript" type="text/JavaScript"> var myDate = new Dat ...

  8. 代码中access 的使用

     C++代码:if(access(strZip.c_str(), 0) == 0){...}    此处为判断strZip中文件是否存在   .c_str() 是他自身字符串名称,该名称是一个压缩文件 ...

  9. html中 table的结构 彻底搞清 caption th thead等

    正因为有太多 随意 称呼的 教法, 所以 感到很困惑, 如, 很多人把th叫标题. 那人家 caption怎么想, th只是一个跟td一样的角色, 只是对他进行加粗 加黑了而已, 用于某些单元格的内容 ...

  10. jQuery 学习之路(3):DOM操作

    一.在元素内部插入 .append(content[,content]) 在指定元素的内部末尾插入字符串,或在指定元素的内部末尾移入指定元素,如 $(".container").a ...