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 快速排序代码
Nov 23 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
基于Python实现文件大小输出
Jan 11 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
使用python编写监听端
Apr 12 Python
Python3之简单搭建自带服务器的实例讲解
Jun 04 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
Python 控制终端输出文字的实例
Jul 12 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
Python基于traceback模块获取异常信息
Jul 23 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
用PHP读取IMAP邮件
2006/10/09 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JavaScript中的闭包
2016/02/24 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
[49:17]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第三场 1月26日
2021/03/11 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python实现单词翻译功能
2017/06/06 Python
itchat接口使用示例
2017/10/23 Python
解决python "No module named pip" 的问题
2018/10/13 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python的继承知识点总结
2018/12/10 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
详解python UDP 编程
2020/08/24 Python
班级入场式解说词
2014/02/01 职场文书
经典商业广告词
2014/03/13 职场文书
区级文明单位申报材料
2014/05/15 职场文书
合作意向书
2014/07/30 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python