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 相关文章推荐
解决pandas中读取中文名称的csv文件报错的问题
Jul 04 Python
Python列表切片操作实例总结
Feb 19 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
python sort、sort_index方法代码实例
Mar 28 Python
python对csv文件追加写入列的方法
Aug 01 Python
wxPython实现带颜色的进度条
Nov 19 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
keras打印loss对权重的导数方式
Jun 10 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
php实现插入排序
2015/03/29 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
Move.js入门
2017/02/08 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
vue-element-admin 菜单标签失效的解决方式
2019/11/12 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
python学生信息管理系统(初级版)
2018/10/17 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
基于Python实现粒子滤波效果
2020/12/01 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
信息学院毕业生自荐信范文
2014/03/04 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
工会换届选举方案
2014/05/21 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
MySQL分库分表详情
2021/09/25 MySQL