重写django的model下的objects模型管理器方式
作者:Dwarf_ 发布时间:2023-04-24 15:10:14
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')
来源:https://blog.csdn.net/qq_19461647/article/details/82855378


猜你喜欢
- 我们首先来看下实例代码:import urllibimport urllib.requestimport refrom urllib imp
- this 的定义表示当前执行代码的环境对象 因此可将 this 的剖析分为“全局环境” 和 “函数环境” 两种类型的环境对象全局环
- 本文中我们将通过一个例子来介绍SQL Server 2005的一个Bug,首先,在建立同义词链接Oracle的时候,我们会使用下面的语句:C
- 作为一个数据分析师,应该信奉一句话——“一图胜千言”。不过这里要说的并不是数据可视化,而是一款全民向的产品形态——表情包!!!!表情包不仅仅
- 一、背景:在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等w
- (1) 针对较为复杂的跨多表的数据业务级别的约束,可以通过触发器来替代大量的后台判断代码,效率较高且便捷。 (2) 如果想通过触发器辅助业务
- Pycharm中import torch报错问题描述:今天在跑GitHub上一个深度学习的模型,需要引入一个torch包,在pycharm中
- 看了一个月的文档和资料以后,终于让我参与到项目中来了,哈哈,痛快!虽然只是让我解决一个小问题,不过有活干就是好。在写代码的过程中遇到了一个小
- 1. settings.py文件做开发离不开必定离不开日志, 以下是我在工作中写Django项目常用的logging配置.# 日志配置BAS
- 1. 前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文
- 在进行深度学习实验时,GPU 的实时状态监测十分有必要。今天详细解读一下 nvidia-smi 命令上图是服务器上 GeForce GTX
- 本文实例为大家分享了javascript实现花样轮播效果的两种实现方法,供大家参考,具体内容如下第一种:简单的带按钮的轮播介绍:左右按钮控制
- 本文实例讲述了Python迭代器和生成器定义与用法。分享给大家供大家参考,具体如下:迭代器 iter()迭代器是访问集合中元素的一种方式,迭
- 这里所谓的复杂表单,是指表单中包含多种不同的输入类型,比如下拉列表框、单行文本、多行文本、数值等。在经常需要更换这类表单的场合,需要有一个表
- 实例如下所示:import numpy as npW_val, b_val = sess.run([weights_tensor, bias
- 今天写这个,要用python去除字符串中的换行符并写入文件,网上查阅,就一句代码replace("\n","&
- 蚁群算法简介蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agen
- 实现效果实现代码from skimage import img_as_floatimport matplotlib.pyplot as pl
- 就服务器端处理而言,ASP是产生动态Web网页的一种相对较新的技术。动态页意味着什么呢?先暂时不考虑客户端相关功能上的进展,也不讨论客户端脚
- 0. 简介上篇博客介绍了goroutine的创建、执行和退出的过程,并且提及了在协程切换时涉及的调度循环,本篇博客我们就来探究一下其他情形引