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 01 Python
python使用logging模块发送邮件代码示例
Jan 18 Python
python数字图像处理之高级形态学处理
Apr 27 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
python实现从ftp服务器下载文件
Mar 03 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
python和php学习哪个更有发展
Jun 17 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
pandas针对excel处理的实现
Jan 15 Python
Python爬取梨视频的示例
Jan 29 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的面试题集
2006/11/19 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
实现动画效果核心方式的js代码
2013/09/27 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
原生js实现点击轮播切换图片
2020/02/11 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
python中的函数用法入门教程
2014/09/02 Python
Python3 处理JSON的实例详解
2017/10/29 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
如何利用python发送邮件
2020/09/26 Python
庆八一活动方案
2014/01/25 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
献爱心标语
2014/06/21 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
投资合作意向书范本
2015/05/08 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
nginx服务器的下载安装与使用详解
2021/08/02 Servers