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常见数制转换实例分析
May 09 Python
详解python时间模块中的datetime模块
Jan 13 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
Python统计时间内的并发数代码实例
Dec 28 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
Python 转移文件至云对象存储的方法
Feb 07 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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 date函数参数详解
2006/11/27 PHP
PHP 采集心得技巧
2009/05/15 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
初学JavaScript第二章
2008/09/30 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
Puppeteer环境搭建的详细步骤
2018/09/21 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
Python实现简单拆分PDF文件的方法
2015/07/30 Python
Python解析json文件相关知识学习
2016/03/01 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
独特的python循环语句
2016/11/20 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
皮肤科医师岗位职责
2013/12/04 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
速龙x4-860k处理器相当于i几
2022/04/20 数码科技
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android