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相关推荐

  1. Django规范化编程6

    Tips: 工欲善其事,必先利其器.我们做Password验证的时候绝壁不可能使用铭文进行验证. 再Django中我们可以采用Django.contrib.auth.hasher.make_passw ...

  2. 规范化编程:ANSI和UNICODE的使用

    规范化编程:ANSI和UNICODE的使用    到底什么是ANSI,什么是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit.8b ...

  3. Django 规范编程5

    Task12 表和模板入门 我们都知道,Django的数据要渲染到网页中离不开Template模板的使用.Template 呈现给用户的界面, 实现MVT中的MT的解耦: V视图函数可以渲染(使用)多 ...

  4. Python爱好者社区历史文章列表(涵盖零基础、爬虫、分析挖掘可视化、机器学习、自然语言处理、面向对象、Django、编程知识、会玩等)...

    10月8日更新: Python爱好者社区最新送书活动 0.Python从零开始系列连载: Python从零开始系列连载(1)--安装环境

  5. python django web典型模块开发实战下载_Django实战 Python Web典型模块与项目开发

    本书结合样例,介绍 Django 的基础知识.主要模块的开发以及权限管理等高级内容,并且通过图书管理系统.博客系统.车费管理系统 3 个项目的开发实战,使读者既能掌握 Django 的重要开发技术,又 ...

  6. python的软件叫什么-django中的app是指什么

    Django中的app(application)就是应用的意思,当我们的项目足够大的时候,我们将功能单独分成多个app进行开发. Django中的app app(application)就是应用的意思 ...

  7. Django 1.8.2 文档

    django 百科全书 入门¶刚开始学习Django或者编程?让我们从这里开始吧! 从零开始: 概述 | 安装 教程: 第1部分:模型(100%) | 第2部分:管理站点(100%) | 第3部分:视 ...

  8. 一、Django框架介绍

    一.Django框架介绍 1.1 框架背景 ​ 要学习一个框架,了解它的诞生,背景,特点是必不可少的.只有对框架有足够多的了解才能确定这个框架是否适合你自己,当然实践是最好的老师,不能仅凭我一面之词来 ...

  9. Django 2.2.1.中文文档

    本文参考: [Django 文档], [Django中文社区] Django 有丰富的文档.一份高度概述的文档会告诉你在哪里找到特定的东西: ◾教程 通过手把手地方式教你一步步的创建一个 Web 应用 ...

最新文章

  1. 几行代码实现老照片上色复原!
  2. CNN架构复现实战 | 附视频和github项目
  3. JBoss4.2.3部署SSH2
  4. maven web项目build失败
  5. 如何对PHP程序中的常见漏洞进行攻击(上)
  6. day5-shelve模块
  7. Visual Studio 2012中使用GitHub
  8. BugkuCTF-MISC题闪的好快
  9. 虚拟机VM10装Mac OS X 10.9.3
  10. 客户和顾客是一个意思吗_履约保证金和投标保证金是一个意思吗?
  11. jquery radio/checkbox change 事件不能触发的问题
  12. svn无法cleanup常见解决方案
  13. 最新的windows xp sp3序列号(绝对可通过正版验证)
  14. Window 10 python 3.7安装 PyV8
  15. 记一次wwwscan目录扫描后获取敏感目录登录后台
  16. outlook邮件路径更改_如何更改Outlook的新邮件警报声音
  17. Tech.Ed盛大开幕 梁念坚致开幕辞
  18. openwrt系统理解
  19. java applet编程_JavaApplet编程技巧
  20. Send Automatic Out Of Office replies from Outlook

热门文章

  1. 码云Pages搭建个人静态网站之旅
  2. 当NAT遇到PPTP
  3. Nginx日志分析系统---ElasticStack(ELK)工作笔记001
  4. CSS实现图片以中心缩放
  5. python中josn使用方法
  6. android获取uevent实例,Android的uevent通信机制
  7. SAP MES与PP模块的集成
  8. 关于LCD的烧屏问题
  9. u-boot 中 tftp、sf命令使用详解
  10. jQuery的滚动条样式改变