Django model反向关联名称的方法


Posted in Python onDecember 15, 2018

如果你在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称。但在抽象基类上这样做就会引发一个很严重的问题。因为 Django 会将基类字段添加到每个子类当中,而每个子类的字段属性值都完全相同 (这里面就包括related_name)。

当你在(且仅在)抽象基类中使用 related_name 时,如果想绕过这个问题,名称中就要包含'%(app_label)s'和 ‘%(class)s'。

‘%(class)s'会替换为子类的小写加下划线格式的名称,字段在子类中使用。

‘%(app_label)s'会替换为应用的小写加下划线格式的名称,应用包含子类。每个安装的应用名称都应该是唯一的,而且应用里每个模型类的名称也应该是唯一的,所以产生的名称应该彼此不同。

from django.db import models

class Base(models.Model):
 m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related")

 class Meta:
 abstract = True

class ChildA(Base):
 pass

class ChildB(Base):
 pass

ChildA.m2m 字段的反向名称是 common_childa_related,而 ChildB.m2m 字段的反向名称是 rare_childb_related。这取决于你如何使用 ‘%(class)s' 和'%(app_label)s来构造你的反向名称。如果你没有这样做,Django 就会在验证 model (或运行 migrate) 时抛出错误。

如果你没有在抽象基类中为某个关联字段定义 related_name 属性,那么默认的反向名称就是子类名称加上'_set',它能否正常工作取决于你是否在子类中定义了同名字段。例如,在上面的代码中,如果去掉 related_name属性,在 ChildA中,m2m 字段的反向名称就是 childa_set;而 ChildB的 m2m 字段的反向名称就是 childb_set。

以上这篇Django model反向关联名称的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中基本的日期时间处理的学习教程
Oct 16 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
python 串口读取+存储+输出处理实例
Dec 26 Python
Python实现自动访问网页的例子
Feb 21 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
opencv读取视频并保存图像的方法
Jun 04 Python
django orm 通过related_name反向查询的方法
Dec 15 #Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 #Python
django 外键model的互相读取方法
Dec 15 #Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 #Python
python调用java的jar包方法
Dec 15 #Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 #Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 #Python
You might like
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
用PHP调用Oracle存储过程
2006/10/09 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
100个不能错过的实用JS自定义函数
2014/03/05 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
js表头排序实现方法
2015/01/16 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
介绍Python中几个常用的类方法
2015/04/08 Python
深入理解Python中装饰器的用法
2016/06/28 Python
python解决字符串倒序输出的问题
2018/06/25 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
Solaris操作系统的线程机制
2012/12/23 面试题
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
最新的互联网创业计划书
2014/01/10 职场文书
2015年党员自评材料
2014/12/17 职场文书
2015年调度员工作总结
2015/04/30 职场文书