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中的正则表达式的用法
Apr 09 Python
python实现杨辉三角思路
Jul 14 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
简单实现Python爬取网络图片
Apr 01 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
Python中函数参数匹配模型详解
Jun 09 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
Python中socket网络通信是干嘛的
May 27 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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下实现农历日历的代码
2007/03/07 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
微信小程序自定义组件
2017/08/16 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
新手常见6种的python报错及解决方法
2018/03/09 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
python实现Virginia无密钥解密
2019/03/20 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
Python 日期与时间转换的方法
2020/08/01 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
如何利用find命令查找文件
2015/02/07 面试题
Exception类的常用方法
2012/06/16 面试题
应届毕业生求职信范文分享
2013/12/26 职场文书
教导处工作制度
2014/01/18 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
学校开除通知书
2015/04/25 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
感恩老师主题班会
2015/08/12 职场文书
安全生产培训心得体会
2016/01/18 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
解决Python字典查找报Keyerror的问题
2021/05/26 Python
世界十大狙击步枪排行榜
2022/03/20 杂记