Django规范化编程3
Task6.5 了解元类
又又又又到了喜闻乐见的吃水不忘挖井人环节https://www.cnblogs.com/ellisonzhang/p/10513238.html
关键概念: 元类是创造类的类,在Python中万物皆可对象,对象是类的实例化可以由类来创建,所以类可以由源类来实例化
Python创建类的方法 type, 一个古老而强大函数,在类的创建中被调用,用来创建出一个类
# type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)) 用法# 覆写一个魔术方法
>>> def __str__(self):
... return self.name
...
# 用Student源类(None)新建一个类,并赋值和方法
>>> Studentss = type('Student',(),{'name':None,'School':'第二实验小学','__str__':__str__})
# 赋值name
>>> students2 = Studentss()
>>> students2.name = '小可爱'
# 上面覆写了魔术方法,可以直接打印self.name
>>> print(students2)
小可爱
由此我们可以看出,Type可以是所有类的源类
我们不仅可以用type使用源类,也可以在类的定义的时候使用魔术方法定义源类,如:写一个类的时候为其添加__metaclass__属性,定义了__metaclass__就定义了这个类的元类
但是问题是,我们在______metaclass______中放什么代码合适,说到底既然一个类是被实例化出来的,那他的元类应该咋写
实际上我们刚刚已经见到了一个万类元类:Type, 我们的metaclass,也就是元类只要放置type, type的子类或能调用type的类即可(return 为type)
我们可以用含type的函数做元类, 用type的子类做元类, 但是这里我用Python3还原博客写的源类的实例代码时结果完全不一致,不知道是不是因为Python3和Python2的结果有如此的大病
那为什么要学这个呢,因为在Django中Model的API是基于元类设计的,唉。不过搞懂了元类,你就能理解Model的源码(Model是由元类ModelBase创建的,ModelBase元类你就可以理解了)
Task7 了解模型类中的objects是啥
课程链接放出来,这一段确实挺抽象的:https://www.bilibili.com/video/BV1UE411L7Fy?p=3
默认情况下: 模型类会创建一个django.db.models.manager.Manage类的对象,赋给objects。。Manage类是BaseManage.from_queryset(QuerySet) 也就是一个查询结果集对象, 也是QuerySet的子/孙类 。可以从QuerySet中拿到数据库记录。
因此我们在模型中可以覆写objects(必须是manager类型,不然。。)
# models.py
objects = models.Manager()
但是objects能干什么?刚刚我们说过Manager是一个查询结果集对象,因此我们可以在模型类中利用objects进行查询,objects可以进行几乎所有的查询
# models.py
class Player(models.Model):virture_name = models.CharField(default = 'GodForever')objects = models.Manager() # 正确的写法
Task8 objects过滤器
# views 完成一个Player等级的过滤
def find_level(request:HttpRequest):
# 通过等级来过滤玩家level_judge = request.Get.get('level',20)level_judge = int(level_judge)# 设置过滤条件, 大于等于: classname__gte,小于等于_lte, 更多过滤法则请移步官网Player = PlayerEntity.objects.filter(level__gte=level_judge,level__lte = 25).all()return render(request,'object_fliter1.html',locals())# 自己设置一下路由,咱就不写了直接开冲
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
可以看到筛选出10到25级的范围了
过滤器有两种,一种是fliter 就是上面用的选择 * 范围之内的, 一种是 exclude, 选择 * 范围之外的。注 :Django的object支持链式查找,及支持 PlayerEntity.objects.filter(a).exclude(b).filter©.filter(d)的写法
# object还可以直接用raw 插入sql语句条件
Player = PlayerEntity.objects.raw('Select * from player_Inform Where level>20')
# 需要注意,此时返回的对象为RawQuerySet 本身就是set集合,不需要all# 同时我们也可已使用orderby进行排序,还有些其他参数可以自己去官网或随便试试,目录叫做:QuerySet方法
Player = PlayerEntity.objects.filter(level__gte=level_judge,level__lte = 25).all().order_by('level')
Task9 F与Q的用法
首先了解我们的F与Q是什么
F对象,可以将自己的属性作为条件值,主要用于模型类的 A 字段属性与 B 字段属性两者的比较。简单来说,F就是拿到当前属性的某一字段值, 并且支持运算.eg.F
from django.db.models import F
# views.py
# 比如这样的应用场景,因为游戏的更新维护或者说系统崩掉了,表示步长给全体玩家等级加15级
def Jiangli(request:HttpRequest):PlayerEntity.objects.update(level= F('level')+15)Player = list(PlayerEntity.objects.all().values())print(Player)return render(request,'F_try.html',locals())# 没错我又又又又没有把定义子路由的细节给你们
效果如图,成功自增
Q 对象相比 F 对象更加复杂一点,它主要应用于包含逻辑运算的复杂查询(and:& or:| 非:~ )。Q 对象把关键字参数封装在一起,并传递给 filter、exclude、get 等查询的方法。
在filter中虽然可以做很多约束,不过级联查询条件都是and 而不是or ,Q对象可以做到all查询。举个例子就很好理解
from django.db.models import Q
# 我们的目标是找一些资深玩家,指伊西俄老玩家和新秀玩家,游玩时间长或等级高的玩家
def Special_Player(request:HttpRequest):Super_Player = list(PlayerEntity.objects.filter(Q(level__gte = 20)|Q(play_valu__gte =20)).values())print(Super_Player)# 因为不想再新建html模板直接print了,虽然浏览器有无reponse的报错但是可以再输出看到,成功
[{'id': 1, 'virture_name': 'Son_Bitch', 'level': 26, 'play_valu': 38.7, 'profile_picture': None}, {'id': 2, 'virture_name': 'MyLover', 'level': 23, 'play_valu': 14.4, 'profile_picture'
: None}, {'id': 3, 'virture_name': "'小可爱'", 'level': 44, 'play_valu': 13.8, 'profile_picture': 't11.png'}]
Django规范化编程3相关推荐
- Django规范化编程6
Tips: 工欲善其事,必先利其器.我们做Password验证的时候绝壁不可能使用铭文进行验证. 再Django中我们可以采用Django.contrib.auth.hasher.make_passw ...
- 规范化编程:ANSI和UNICODE的使用
规范化编程:ANSI和UNICODE的使用 到底什么是ANSI,什么是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit.8b ...
- Django 规范编程5
Task12 表和模板入门 我们都知道,Django的数据要渲染到网页中离不开Template模板的使用.Template 呈现给用户的界面, 实现MVT中的MT的解耦: V视图函数可以渲染(使用)多 ...
- Python爱好者社区历史文章列表(涵盖零基础、爬虫、分析挖掘可视化、机器学习、自然语言处理、面向对象、Django、编程知识、会玩等)...
10月8日更新: Python爱好者社区最新送书活动 0.Python从零开始系列连载: Python从零开始系列连载(1)--安装环境
- python django web典型模块开发实战下载_Django实战 Python Web典型模块与项目开发
本书结合样例,介绍 Django 的基础知识.主要模块的开发以及权限管理等高级内容,并且通过图书管理系统.博客系统.车费管理系统 3 个项目的开发实战,使读者既能掌握 Django 的重要开发技术,又 ...
- python的软件叫什么-django中的app是指什么
Django中的app(application)就是应用的意思,当我们的项目足够大的时候,我们将功能单独分成多个app进行开发. Django中的app app(application)就是应用的意思 ...
- Django 1.8.2 文档
django 百科全书 入门¶刚开始学习Django或者编程?让我们从这里开始吧! 从零开始: 概述 | 安装 教程: 第1部分:模型(100%) | 第2部分:管理站点(100%) | 第3部分:视 ...
- 一、Django框架介绍
一.Django框架介绍 1.1 框架背景 要学习一个框架,了解它的诞生,背景,特点是必不可少的.只有对框架有足够多的了解才能确定这个框架是否适合你自己,当然实践是最好的老师,不能仅凭我一面之词来 ...
- Django 2.2.1.中文文档
本文参考: [Django 文档], [Django中文社区] Django 有丰富的文档.一份高度概述的文档会告诉你在哪里找到特定的东西: ◾教程 通过手把手地方式教你一步步的创建一个 Web 应用 ...
最新文章
- 几行代码实现老照片上色复原!
- CNN架构复现实战 | 附视频和github项目
- JBoss4.2.3部署SSH2
- maven web项目build失败
- 如何对PHP程序中的常见漏洞进行攻击(上)
- day5-shelve模块
- Visual Studio 2012中使用GitHub
- BugkuCTF-MISC题闪的好快
- 虚拟机VM10装Mac OS X 10.9.3
- 客户和顾客是一个意思吗_履约保证金和投标保证金是一个意思吗?
- jquery radio/checkbox change 事件不能触发的问题
- svn无法cleanup常见解决方案
- 最新的windows xp sp3序列号(绝对可通过正版验证)
- Window 10 python 3.7安装 PyV8
- 记一次wwwscan目录扫描后获取敏感目录登录后台
- outlook邮件路径更改_如何更改Outlook的新邮件警报声音
- Tech.Ed盛大开幕 梁念坚致开幕辞
- openwrt系统理解
- java applet编程_JavaApplet编程技巧
- Send Automatic Out Of Office replies from Outlook