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使用MD5加密字符串示例
Aug 22 Python
python登陆asp网站页面的实现代码
Jan 14 Python
python通过BF算法实现关键词匹配的方法
Mar 13 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python三级菜单的实例
Sep 13 Python
python 调用有道api接口的方法
Jan 03 Python
django模板加载静态文件的方法步骤
Mar 01 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
django自定义模板标签过程解析
Dec 14 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
使用BeautifulSoup4解析XML的方法小结
Dec 07 Python
如何用python绘制雷达图
Apr 24 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
PHP实现时间轴函数代码
2011/10/08 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php文件读取方法实例分析
2015/06/20 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
微信小程序自定义组件
2017/08/16 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python创建系统目录的方法
2015/03/11 Python
Python中enumerate函数代码解析
2017/10/31 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
python实现文件的备份流程详解
2019/06/18 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
火山动力Java笔试题
2014/06/26 面试题
应届毕业生简历自我评价
2014/01/31 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
个人职业及收入证明
2014/10/13 职场文书
离婚律师函范本
2015/05/27 职场文书
小学六年级毕业感言
2015/07/30 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书