重写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 28 Python
python实现备份目录的方法
Aug 03 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
Jan 17 Python
Python2和Python3.6环境解决共存问题
Nov 09 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
详解python中eval函数的作用
Oct 22 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
详解Python小数据池和代码块缓存机制
Apr 07 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
综合图片计数器
2006/10/09 PHP
php学习之function的用法
2012/07/14 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
Python set集合类型操作总结
2014/11/07 Python
python中defaultdict的用法详解
2017/06/07 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
高中生自我鉴定范文
2013/10/30 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
个人安全生产责任书
2014/07/28 职场文书
2014年党员发展工作总结
2014/12/02 职场文书
消防演习感想
2015/08/10 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers