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实现从web抓取文档的方法
Sep 26 Python
python 全局变量的import机制介绍
Sep 07 Python
Tornado 多进程实现分析详解
Jan 12 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
简单了解python的一些位运算技巧
Jul 13 Python
Python简易版停车管理系统
Aug 12 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
python中列表的含义及用法
May 26 Python
python 多线程共享全局变量的优劣
Sep 24 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 SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
form自动提交实例讲解
2017/07/10 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
在Vue项目中使用snapshot测试的具体使用
2019/04/16 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
python动态加载变量示例分享
2014/02/17 Python
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
使用python实现画AR模型时序图
2019/11/20 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
用python批量下载apk
2020/12/29 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
社区敬老月活动实施方案
2014/02/17 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
幼师求职自荐信
2015/03/26 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
稽核岗位职责范本
2015/04/13 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python