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与Redis的连接教程
Apr 22 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
python下setuptools的安装详解及No module named setuptools的解决方法
Jul 06 Python
Python中装饰器学习总结
Feb 10 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
简单谈谈python基本数据类型
Sep 26 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
Feb 20 Python
python 计算积分图和haar特征的实例代码
Nov 20 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 Python
利用python进行数据加载
Jun 20 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 第二节 数据类型之数组
2012/04/28 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php实现简单文件下载的方法
2015/01/30 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
jQuery实现表格隔行换色
2018/09/01 jQuery
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
python 网络编程常用代码段
2016/08/28 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
详解Python中的路径问题
2020/09/02 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
如何用PHP实现邮件发送
2012/12/26 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
给儿子的表扬信
2014/01/15 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
边城读书笔记
2015/06/29 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技