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 相关文章推荐
简单理解Python中基于生成器的状态机
Apr 13 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
Python 类的继承实例详解
Mar 25 Python
Python处理CSV与List的转换方法
Apr 19 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
python 批量将中文名转换为拼音
Feb 07 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随机输出名人名言的代码
2012/10/07 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
Jquery ui css framework
2010/06/28 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
jquery选择器简述
2015/08/31 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
python深度优先搜索和广度优先搜索
2018/02/07 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
营销人才自我鉴定范文
2013/12/25 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库