重写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编程中对super函数的正确理解和用法解析
Jul 02 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Python2.7 实现引入自己写的类方法
Apr 29 Python
python查看数据类型的方法
Oct 12 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
python关闭占用端口方式
Dec 17 Python
python使用多线程+socket实现端口扫描
May 28 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
使用python实现学生信息管理系统
Feb 25 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
php include和require的区别深入解析
2013/06/17 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
ThinkPHP中关联查询实例
2014/12/02 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
vue视图不更新情况详解
2019/05/16 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
Python 互换字典的键值对实例
2019/02/12 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
英国马莎百货印度官网:Marks & Spencer印度
2020/10/08 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
公司寄语大全
2014/04/10 职场文书
幼师求职信
2014/06/23 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书