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实现巡检系统(solaris)示例
Apr 02 Python
Python中使用Boolean操作符做真值测试实例
Jan 30 Python
python入门教程之识别验证码
Mar 04 Python
详解用Python处理HTML转义字符的5种方式
Dec 27 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
Python读取mat文件,并转为csv文件的实例
Jul 04 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
Python数据分析pandas模块用法实例详解
Nov 20 Python
使用 Python 遍历目录树的方法
Feb 29 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
python绘制箱型图
Apr 27 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 strrpos()与strripos()函数
2013/08/31 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
Python使用贪婪算法解决问题
2019/10/22 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Python自带的IDE在哪里
2020/07/01 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
应用心理学个人求职信范文
2013/12/11 职场文书
五年级语文教学反思
2014/01/30 职场文书
销售人员自我评价
2014/02/01 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
经销商订货会主持词
2014/03/27 职场文书
买房协议书
2014/04/11 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
使用springMVC所需要的pom配置
2021/09/15 Java/Android
配置nginx负载均衡
2022/05/06 Servers
python中使用redis用法详解
2022/12/24 Redis