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 测试实现方法
Dec 24 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
Tensorflow简单验证码识别应用
May 25 Python
Django自定义认证方式用法示例
Jun 23 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Django接收自定义http header过程详解
Aug 23 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
django从后台返回html代码的实例
Mar 11 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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/04/19 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
师范应届毕业生自荐信
2013/11/18 职场文书
预备党员的自我评价
2014/03/12 职场文书
企业趣味活动方案
2014/08/21 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
优秀党员先进材料
2014/12/18 职场文书
布达拉宫导游词
2015/02/02 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript