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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
Python实现二叉搜索树
Feb 03 Python
Python实现KNN邻近算法
Jan 28 Python
Django权限机制实现代码详解
Feb 05 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
Python虚拟环境venv用法详解
May 25 Python
Python 实现微信自动回复的方法
Sep 11 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
Python读写锁实现实现代码解析
Nov 28 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
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
php发送post请求的三种方法
2014/02/11 PHP
php中adodbzip类实例
2014/12/08 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
CentOS7下python3.7.0安装教程
2018/07/30 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
pycharm配置python 设置pip安装源为豆瓣源
2021/02/05 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
物理教育专业毕业生推荐信
2013/11/03 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
春节活动策划方案
2014/01/24 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
企业法人代表证明书
2014/09/27 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
初中重阳节活动总结
2015/05/05 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
详解Redis主从复制实践
2021/05/19 Redis