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 25 Python
最大K个数问题的Python版解法总结
Jun 16 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
Django如何实现内容缓存示例详解
Sep 24 Python
深入浅出学习python装饰器
Sep 29 Python
python3处理含有中文的url方法
May 10 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
关于python中的xpath解析定位
Mar 06 Python
深入了解NumPy 高级索引
Jul 24 Python
Python中itertools库的四个函数介绍
Apr 06 Python
Django框架模板用法详解
Jun 10 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正则走开
2008/03/15 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
js表头排序实现方法
2015/01/16 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
python 生成不重复的随机数的代码
2011/05/15 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
Python常用断言函数实例汇总
2020/11/30 Python
高山背包:High Sierra
2017/11/23 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
初婚未育未抱养证明
2014/01/12 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
企业授权委托书范本
2014/09/22 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
离婚答辩状范文
2015/05/22 职场文书
预备党员转正意见
2015/06/01 职场文书
小学六年级毕业感言
2015/07/30 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
小学副班长竞选稿
2015/11/21 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python