crm的知识点整理

'''
# 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>,其源代码就必须是&lt;div&gt;
    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. 深浅拷贝

'''
原文地址:https://www.cnblogs.com/ldq1996/p/8205766.html