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基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
利用python实现xml与数据库读取转换的方法
Jun 17 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
pandas数值计算与排序方法
Apr 12 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
如何使用python操作vmware
Jul 27 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
python图形用户接口实例详解
Dec 16 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
python设置表格边框的具体方法
Jul 17 Python
Python3爬虫带上cookie的实例代码
Jul 28 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
当海贼王变成JOJO风
2020/03/02 日漫
php 获取mysql数据库信息代码
2009/03/12 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
跟老齐学Python之变量和参数
2014/10/10 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python中List.count()方法的使用教程
2015/05/20 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
违反学校规定检讨书
2014/01/18 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
黄埔军校观后感
2015/06/10 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
毕业班工作总结
2015/08/10 职场文书
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏