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的Flask框架中实现单元测试的教程
Apr 20 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
Python断言assert的用法代码解析
Feb 03 Python
python实现知乎高颜值图片爬取
Aug 12 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
python中resample函数实现重采样和降采样代码
Feb 25 Python
Python 字符串池化的前提
Jul 03 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
python实现图片转字符画的完整代码
Feb 21 Python
python 自动刷新网页的两种方法
Apr 20 Python
Python超简单容易上手的画图工具库推荐
May 10 Python
Python matplotlib绘制雷达图
Apr 13 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php MessagePack介绍
2013/10/06 PHP
preg_match_all使用心得分享
2014/01/31 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
DOM事件探秘篇
2017/02/15 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
python万年历实现代码 含运行结果
2017/05/20 Python
windows下python安装小白入门教程
2018/09/18 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
如何定义TensorFlow输入节点
2020/01/23 Python
python实现电子词典
2020/03/03 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
新疆民族团结演讲稿
2014/08/27 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
黄埔军校观后感
2015/06/10 职场文书
职位证明模板
2015/06/23 职场文书
病房管理制度范本
2015/08/06 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA