''' # 1. 通过ChangeList封装好多数据 # 2. 销售中公共资源:Q查询,3天 15天 from django.db.models import F,Q F 使用查询条件的值,专门取对象中某列值的操作 models.User.objects.update(age=F('age')+1) Q对象常用于实现搜索功能,常配合双下划綫查询使用 | is or, & is and ~ 表示否定 q1=models.Book.objects.filter(Q(title__startswith='P')).all() Q对象组合使用可以产生一个新对象 Q(title__startswith='P') | ~Q(pub_date__year=2005) Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。 Book.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), title__startswith='P') # 3. 使用yield实现 # - 生成器函数,对数据进行加工处理 # - __iter__和yield配合 # 4. 获取Model类中的字段对from django.db.models import F应的对象 # class Foo(model.Model): # xx = models.CharField() # # Foo.get_field('xx') # # 5. 模糊搜索功能 # 使用Q方法 # 6. Type创建类 # type时所有元类的父亲 object是type(object的类型是type),type也是object(type继承自object) >>> isinstance(object, type) True >>> isinstance(type, object) True 在python中一切皆object,所有对象都是从object继承而来的,type也是object,而object的type是type >>> type.__base__ <type 'object'> >>> type(object) <type 'type'> 1、type是一切type的类型 2、object是所有对象的基类,type也继承自object 3、object的type是type 去掉object所有对象都不能用了,而去掉type,所有对象还是可以正常运作的,只是没有一个东西标识他的类型了 # 7. 自动派单 # - 原来在内存中实现,问题:重启和多进程时,都有问题。 # - redis # - 状态 # - 原来数据(权重表 权重和个数) # - pop数据 # 8. 使用 list_diplay配置 # list_display = [函数名,] # # 9. reverse反向生成URL #使用方法: def index(request): from django.urls import reverse test_url = reverse('xx') print(test_url) return HttpResponse("进入index") def text(requext): return HttpResponse("进入text") urlpatterns = [ url(r'^index/', index,), url(r'^text/dasd/asd/asd/sad/asd/as/d', text,name='xx'), ] # 10. 模板 # 为了减少重复代码而使用模板 命名为base.html,这个页面主要放公用部分的代码,各个子页面都可以继承这个页面的样式。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}首页{% endblock %}</title> {% block js %} {% endblock %} {% block css %} {% endblock %} </head> <body> {% block content %}{% endblock %} </body> </html> 如下所示,{% extends ‘base.html’ %}作为基础模板,必须放在第一行才可以识别。 {% block %}这个标签,告诉模板引擎,子模板可以重载这些 {% include %}允许模板中包含其他模板。 注意css和js等静态文件,是和html不同的识别方式。 {% extends 'base.html' %} <!-- 该页面不允许出现js以及css代码,content代码可直接写在本文件中,下面只是content的实例代码 --> {% block title %} <!-- 此处写页面标题 --> {% endblock %} {% block js %} <!-- 此处填充js链接 --> <script type="text/javascript" src="..."></script> {% endblock %} {% block css %} <!-- 此处填充css链接 --> {% endblock %} {% block content %} <!-- 此处填充页面主体内容 --> {% include 'taskApp/cjjdglContent.html' %} {% endblock %} # 11. ready方法定制起始文件 # - 文件导入实现单例模式 # 12. inclusion_tag # 一种比较普遍的tag类型是只是渲染其它模块显示下内容,这样的类型叫做Inclusion Tag。 @register.inclusion_tag('link.html', takes_context=True) def jump_link(context): return { 'link': context['home_link'], 'title': context['home_title'], } # 13. 中间件的使用 # 什么是 middleware? Middlewares 是修改 Django request 或者 response 对象的钩子. 什么时候使用middleware 1.多个网页的登录权限认证时 2.如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。 3.可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。 Django还有一些默认的middleware比如: AuthenticationMiddleware 还有更多的都可以在shting中配置 使用middleware时应该记住的东西! middleware的顺序非常重要 一个middleware只需要继承object类 一个middleware可以实现process_request(方法) 给两个middleware添加process_request方法 class AnotherMiddleware(object): def process_request(self, request): print "Another middleware executed" def process_response(self, request, response): print "AnotherMiddleware process_response executed" return response class BookMiddleware(object): def process_request(self, request): print "Middleware executed" print request.user return HttpResponse("some response") #self._start = time.time() def process_response(self, request, response): print "BookMiddleware process_response executed" return response # 15. importlib + getattr ######setting.py##### MESSAGE_CLASSES = [ 'utils.message.email.Email', 'utils.message.msg.Msg', 'utils.message.wx.WeChat', 'utils.message.dingding.DingDing', ] ##.py import importlib #动态导入模块 from django.conf import settings for cls_path in settings.MESSAGE_CLASSES: # cls_path是字符串 module_path,class_name = cls_path.rsplit('.',maxsplit=1) m = importlib.import_module(module_path) obj = getattr(m,class_name)() obj.send(subject,body,to,name,) # # 16. FilterOption,lambda表达式 #lanmbda是一个匿名函数 它可以通过传给reduce中的函数(必须是二元函数) 依次对数据集中的数据进行操作。 from functools import reduce list=[i for i in range(1,101)] a=reduce(lambda x,y:x+y,list) print(a) # 17. QueryDict # - 原条件的保留 # - filter # 18. ModelForm #from django.forms import Form,ModelForm,fields,widgets as wd class QueModelForm(ModelForm): class Meta: model=models.Question # fields=['caption','tp'] error_messages = { 'caption':{'required':'名称不等为空','invalid':'格式错误'}, 'tp':{'required':'名称不等为空','invalid':'格式错误'} } widgets = { 'caption':wd.TextInput(attrs={'class':'form-control',}), # 'tp':wd.TextInput(attrs={'class':'form-control'}) } class UserTypeModeForm(ModelForm): title = fields.CharField(max_length=6,required=True,widget=wd.Textarea()) class Meta: model = models.UserType fields = "__all__" error_messages = { 'title':{'required':'名称不能为空','invalid':'格式错误'} } widgets = { 'title':wd.TextInput(attrs={'class':'c1'}) } # 19. 面向对象的 @property @classmethod #staticmethod和classmethod的作用: 一般来说,要使用某个类的方法,需要先实例化一个对象在调用方法。 而使用@staticmethod或classmethod,就可以不需要实例化,直接类名.方法名来调用。 这有利于组织代码,把某些应该属于某个类的函数给放到那个类里,同时有利于代码整洁 区别: @staticmethod不需要表示自身对象的self和自身类的cla参数,就跟使用函数一样 @classmethod也不需要self参数,但第一个参数需要表示自身类的cls参数 class A(): cap='A' def foo(self): print('B') @staticmethod def static_cap(): print('static') print(A.cap) A().foo() @classmethod def class_foo(cls): print('class') print(cls.cap) cls().foo() print(A.cap) # A.static_cap() # A.class_foo() @property:方法调用时不用加括号 # 20. mark_safe 何谓转义?就是把html语言的关键字过滤掉。例如,<div>就是html的关键字,如果要在html页面上呈现<div>,其源代码就必须是<div> PS:转义其实就是把HTML代码给转换成HTML实体了! 默认情况下,django自动为开发者提供escape功能,即在html代码render之前,先进行转义,然后再呈现出来。 这样的话,我们如果想输出一个链接,被转义之后,可能就无法得到我们想要的结果。 1.使用mark_safe函数标记后,django将不再对该函数的内容进行转义 2.在template中 可以使用 {{ data|safe }} 3.在自定义模板语法中可以:把is_safe属性设置为Ture @register.filter def myfilter(value): return value myfilter.is_safe = True # # 21. 抽象方法抽象类+raise Im... ##base.py #####方法一###### from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=ABCMeta): @abstractmethod def send(self,subject,body,to,name): pass ########方法二####### class BaseMessage(object): def send(self, subject, body, to, name): raise NotImplementedError('未实现send方法') #######dingding.py######### from .base import BaseMessage class DingDing(BaseMessage): def __init__(self): pass def send(self,subject,body,to,name): print('钉钉消息发送成功') # 22. 组件中的装饰器,实现self.request = request # # 23. 自执行函数 # (function(arg){ # # # })('sf') # # # 24. URL的钩子函数 # # 25. 多继承 # # 26. 批量导入,xlrd #table = data.sheets()[0] table = data.sheet_by_index(0) print(table) #获取正行或是整列的值 con = table.row_values(0)#[356.0, '星际牛仔', 'カウボーイビバップ', ' 26话 / 1998年10月23日 / 渡辺信一郎 / 矢立肇 / 川元利浩 ', 9.1, '(4021人评分)'] con = table.col_values(2)#['cname', '星际牛仔', '攻壳机动队 S.A.C. 2nd GIG', '攻壳机动队 STAND ALONE COMPLEX', '新世纪福音战士', ] print(con) #获取行数与列数 nrows = table.nrows print(nrows)#673 ncols = table.ncols print(ncols)#6 #循环行列表数据 # for i in range(nrows): # print(table.row_values(i)) #循环列列表数据 for i in range(ncols): print(table.col_values(i)) #单元格索引 val = table.cell(5,5).value # print(val2) # 27. redis连接池 # 为什么使用Redis连接池? 首先Redis也是一种数据库,它基于C/S模式,因此如果需要使用必须建立连接,稍微熟悉网络的人应该都清楚地知道为什么需要建立连接, C/S模式本身就是一种远程通信的交互模式,因此Redis服务器可以单独作为一个数据库服务器来独立存在。 import redis conn = redis.Redis(host='192.168.20.150',port=6379,password='') # conn.set('ldq_k1','v1') k1 = conn.get('ldq_k1') print(k1)#b'v1' # conn.rpush('ldq_k2',*[1,2,3,4,5,6]) k2= conn.rpop('ldq_k2') print(k2) # 28. 工厂模式 # settings.py # MSG_PATH = "path.Email" # # # class XXFactory(object): # @classmethod # def get_obj(cls): # settings.MSG_PATH # # rsplit # # importlib # # getattr # return obj # # class Email(object): # def send ... # # class WeChat(object): # def send ... # # class Msg(object): # def send ... # # # 29. Models类中自定义save方法 借鉴了admin重写了save方法 from django.contrib import admin class ArticleAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): # 自定义操作 obj.save() defsave(self,*args,**kwargs): do_something() super(YourModel, self).save(*args,**kwargs) # Call the "real" save() method. do_something_else() # # 30. django admin中注册models时候 # from django.contrib import admin # # from . import models # # # 方式一 # class UserConfig(admin.ModelAdmin): # pass # # admin.site.register(models.UserInfo,UserConfig) # # # 方式二 # @admin.register(models.UserInfo) # class UserConfig(admin.ModelAdmin): # pass # # 31. 深浅拷贝 '''