重写django的model下的objects模型管理器方式


Posted in Python onMay 15, 2020

django自定义管理器和model的继承

在我写代码时建立的很多数据库需要一些共同的字段,比如is_active, create_time这些字段,所以可以建立一个基类model

模型的继承

我们可以充分利用oop特性,建立一个基类model,以后所有的model都继承这个类, 就不用在每个类都额外添加字段

class BaseModel(models.Model):
  is_active = models.BooleanField(default=True)
  create_time = models.DateTimeField()

  class Meta:
   '''
   指定这个类是一个抽象模型类, 这个模型就不会被生成表
   '''
    abstract = True 
  
class ChildModel(BaseModel):
  name = models.CharField(max_length=10)
  age = models.PositiveIntegerField()
    
  class Meta:
    '''
    meta属性可以重写, 不重写的话也会继承基类meta
    '''
    verbose_name = '子模型'

重写Django的model.objects

当我们使用model.objects.filter()时,经常会过滤掉is_active=False的,但是这样我们每个 filter(is_active=True)都需要这样写,那我们能不能重写掉这个filter方法, 让他每次可以自己过滤掉,这里我们可以看一下django的源码

# 这里源码我就不拉出来了, 我们可以看到django是set了个objects属性, 这个属性对应是一个类的实例对象

class Manager(BaseManager.from_queryset(QuerySet)):
'''
objects 是这个类的实例对象, 这个类我们可以看到他其实继承了 QuerySet类里的方法,
 所以我们可以直接重写个这个类方法,并重写filter方法
'''
  def filter(self, *args, **kwargs):
    """
    我们可以看到 QuerySet里的filter方法和exclude方法都是调用了这个方法, 这个方法的内部实现可
    以自己看一看,就是用的kwargs里的参数
    """
    return self._filter_or_exclude(False, *args, **kwargs)

class MyManager(models.Manager):
  
  def filter(self, *args, **kwargs):
  '''
  源代码的filter函数是有返回值的,所以我们将super出来的结果返回出去,我们只需要在kwargs中增加个参数就行
  '''
    if not kwargs.get('is_active', True): # 如果需要查看所有数据,
      kwargs['is_active'] = False
    return super(AddressManager, self).filter(*args, **kwargs)

# 最后我们在我们的ChildModel下将objects对象赋值为MyManager的实例对象就可以使用了
# 我们可以将这个objects写在基类里面,这样所有的model就可以都会有这个方法,具体怎么使用视情况而定

class ChildModel(models.Model):
  objects = MyManager()

模型类也是可以多继承的,如果有特殊的用法可以具体百度或Google一下, 这里只是个简单的引入面向对象的概念,我们很多地方可以用继承框架已有的类并重写类中的方法,是我们的代码更加pythonic

补充知识:Django中的Model中的字段属性和选项

字段类型:

autoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中

CharField(max_length=字符长度):字符串,默认的表彰样式是TextInput

TextField:大文本字段,一般超过4000时使用,默认的表单控件是Textarea

IntegerField:整数

DecimalField(max_digits=None, decimal_places=None): 使用Python的Decimal实例表示的十进制浮点数

参数说明: DecimalField.max_digits----位数总数
DecimalField.decimal_places---小数点后的数字位置

FloatField: 使用Python的float实例来表示的浮点数

BooleanField:True/False 字段,此字段的默认表彰控制是CheckboxInput

NullBooleanField:支持 Null, True, False 三种值

DateField([auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期

参数说明:
DateField.auto_now
每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”
的时间戳,它总是使用当前日期,默认为 False

DateField.auto_now_add

当前对象第一次被创建时自动设置当前时间,用于创建的时间戳,

它总是使用当前日期,默认为 False

说明
该字段默认对应的表单控件是一个TextInput.在管理员站点添加了一个
JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外
的invalid_date错误消息键
注意
auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间
的任何组合将会发生错误的结果

TimeField: 使用Python的datetime.time实例表示的时间,参数同DateField

DateTimeField: 使用Python的datetime, datetime实例表示的日期和时间,参数同DateField

FileField: 一个上传文件的字段

ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是一个有效的image

字段选项

概述:通过字段选项,可以实现对字段的约束, 在字段对象中通过关键字参数指定

null:如果为True,Django将空值以NULL存储在数据库中,默认值为False

blanke:如果为True,则该字段允许为空白,默认值为False

注意: null是数据库范畴的概念,blank是表彰验证范畴的概念

db_column:字段的名称,如果未指定,则使用属性的名称

db_index:若值为 True,则在表中会为此字段创建索引

default: 默认值

primary_key: 若为 True,则该字段会成为模型的主键字段

unique:如果为 True,这个字段在表中必须有唯一值

注意:在生成迁移文件之后如果修改的参数不影响表结构,则不用重新生成迁移文件。(default,blank 不影响表的结构。不用重新生成迁移文件)

关系类型

分类:

ForeignKey:一对多,将字段定义在多的端中

ManyToManyField:多对多,将字段定义在两端中

OneToOneField:一对一,将字段定义在任意一端中

(1)用一访问多:格式: 对象.模型类小写_set

示例: grade.students_set

(2)用一访问一:格式:对象.模型类小写

示例: grade.studnets

(3)访问id:格式:对象.属性_id

例子:btitle = models.CharField(max_length=20,db_column=‘title',unique=‘true')

以上这篇重写django的model下的objects模型管理器方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈python类属性的访问、设置和删除方法
Jul 25 Python
怎样使用Python脚本日志功能
Aug 14 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
Python使用贪婪算法解决问题
Oct 22 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python第三方库学习笔记
Feb 07 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
python UIAutomator2使用超详细教程
Feb 19 Python
如何用python插入独创性声明
Mar 31 Python
Python测试框架pytest高阶用法全面详解
Jun 01 Python
Python基于pip实现离线打包过程详解
May 15 #Python
Django在Model保存前记录日志实例
May 14 #Python
django 连接数据库出现1045错误的解决方式
May 14 #Python
Django ORM filter() 的运用详解
May 14 #Python
Django设置Postgresql的操作
May 14 #Python
numpy矩阵数值太多不能全部显示的解决
May 14 #Python
使用python采集Excel表中某一格数据
May 14 #Python
You might like
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
Yii全局函数用法示例
2017/01/22 PHP
php服务器的系统详解
2019/10/12 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
vue ssr 指南详读
2018/06/29 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
windows系统下Python环境搭建教程
2017/03/28 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
MySQL数字类型自增的坑
2021/05/07 MySQL
js前端图片加载异常兜底方案
2022/06/21 Javascript