Django框架自定义模型管理器与元选项用法分析


Posted in Python onJuly 22, 2019

本文实例讲述了Django框架自定义模型管理器与元选项用法。分享给大家供大家参考,具体如下:

自定义模型管理器

每个模型类默认都有一个 objects 类属性,可以把它叫 模型管理器。它由django自动生成,类型为

django.db.models.manager.Manager

可以在模型类中自定义模型管理器,自定义后, Django将不再生成默认的 objects。(模型类可以自定义多个管理器)

例如:

class Department(models.Model):
  # 自定义模型管理器
  manager = models.Manager()

调用 Department.objects会抛出AttributeError异常,而 Department.manager.all()会返回一个包含所有Department对象的列表。

两种情况需要自定义管理器

修改管理器返回的原始查询集

需求: 调用 Department.manager.all()返回的是2009年之后成立的部门

管理器类中添加额外的方法,帮我们操作模型类对应的数据表

需求: 在管理器类中,定义一个创建部门的方法

一、自定义模型管理器

class DepartmentManager(Manager):
  # 修改管理器返回的原始查询集
  def all(self):
    """重写all方法:只返回2009年之后成立的部门"""
    return super().all().filter(create_date__gte=date(2009,1,1))
  # 在模型管理器中封装增删查的方法
  def create_dep(self, name, create_date):
    """新增一个部门"""
    dep = Department()
    dep.name = name
    dep.create_date = create_date
    dep.save()
    return dep # 返回新增后的员工对象

二、在模型类中使用自定义的模型管理器

class Department(models.Model):
  """部门类"""
  ...
  # 自定义模型管理器(默认的objects就不会再生成)
  objects = DepartmentManager()

三、在视图函数中,使用自定义的模型管理器中的方法

def add_dep(request):
  """新增部门"""
  # d = Department()
  # d.name = '财务部'
  # d.create_date = date(2018, 1, 1)
  # d.save()
  # 调用自定义的模型管理器,新增一个部门
  Department.objects.create_dep('财务部', date(2018, 1, 1))
  # 返回的不再是所有的部门,而是2009年之后成立的部门
  # Department.objects.all()
  return redirect('/show_deps')

元选项(Meta)

一、修改表名:

Django默认生成的表名:

应用名小写_模型类名小写
可以通过在模型类中定义Meta类来修改表名:

class Department(models.Model):
  """部门类"""
  name = models.CharField(max_length=20)
  class Meta(object):
     """指定表名"""
     db_table = "department"

重新生成迁移文件,并迁移生成表,查看表名是否有修改

二、修改模型类在管理后台的显示名称

Django框架自定义模型管理器与元选项用法分析

class Meta:
  # 定义表名
  db_table = 'department'
  # 定义在管理后台显示的名称
  verbose_name = '部门'
  # 指定复数时的名称(去除复数的s)
  verbose_name_plural = verbose_name

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
深入理解Javascript中的this关键字
Mar 27 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
Python使用googletrans报错的解决方法
Sep 25 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
django迁移数据库错误问题解决
Jul 29 Python
如何基于Python批量下载音乐
Nov 11 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
python实现日志按天分割
Jul 22 #Python
python re.sub()替换正则的匹配内容方法
Jul 22 #Python
简单了解python gevent 协程使用及作用
Jul 22 #Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 #Python
python+logging+yaml实现日志分割
Jul 22 #Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 #Python
python Gunicorn服务器使用方法详解
Jul 22 #Python
You might like
php自定义的格式化时间示例代码
2013/12/05 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
浅谈JS继承_借用构造函数 & 组合式继承
2016/08/16 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
详解微信UnionID作用
2019/05/15 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
python根据出生日期返回年龄的方法
2015/03/26 Python
Python中的filter()函数的用法
2015/04/27 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
Python使用正则表达式实现爬虫数据抽取
2020/08/17 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
俄罗斯女装店:12storeez
2019/10/25 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
华三通信H3C面试题
2015/05/15 面试题
考试不及格的检讨书
2014/01/22 职场文书
财务总监管理职责范文
2014/03/09 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis