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 相关文章推荐
python3生成随机数实例
Oct 20 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
Python实现读取并保存文件的类
May 11 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
Python实现正整数分解质因数操作示例
Aug 01 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
Python 音频生成器的实现示例
Dec 24 Python
Python yield的用法实例分析
Mar 06 Python
Python调用JavaScript代码的方法
Oct 27 Python
Python多线程 Queue 模块常见用法
Jul 04 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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中的null合并运算符
2015/12/30 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
python继承和抽象类的实现方法
2015/01/14 Python
深入理解python try异常处理机制
2016/06/01 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
什么是View State?
2013/01/27 面试题
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
监理员的岗位职责
2013/11/13 职场文书
军训学生自我鉴定
2014/02/12 职场文书
微笑服务演讲稿
2014/05/13 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
酒会邀请函
2015/01/31 职场文书
大学军训决心书
2015/02/05 职场文书
2015年新农合工作总结
2015/03/30 职场文书
小学生家长意见
2015/06/03 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python