• Django two


    http://www.cnblogs.com/yuanchenqi/articles/6083427.html

    Django:

        1.安装Django

            pip install  django

        2.创建project

            django-admin starproject myset

        3.创建APP

            python manage.py starapp app01

        4.setting配置//jQuery

            TEMPLATES

            STAICFILES_DIR=(

                os.path.join(BASE_DIR,"statics"),

            )

            STATIC_URL = '/static/'

                url.py

                view.py

        5.使用模板

            render(request,"index.html")

        6.启动项目

            python manage.py runnserver 127.0.0.1:8090

        7.链接数据库

            model.py

        8.更新数据库

            Python manage.py makemigrations

            python manage.py migrate

        9.创建admin用户

            Python manage.py createsuperuser

        10.清空数据库

            python manage.py flush

        11.启动交互界面

            python manage.py  shell

        12.详细命令列表

            Python manage.py

    MTV-templates:

        1.url(r'^index',view.index,name='rename') 建立别名,提高耦合,前后端分离

            eg:<from action="{% url 'rename'%}" method="post">

          url(r'^index',view.StudentView.as_view(),name='student')#CBV

          url(r'^article/(?P<year>d{4})/(?P<month>d{2})$', views.year_month_hasname)#有名分组

            view:views.month_archive(request, year, month)

        2.include url

            eg:url(r'^myapp/',include('myapp.urls')),

        3.http请求中的两个核心对象:

            http请求:HttpRe

        4.locals():可以直接将函数中的所有变量传递给模板

            return render(request,"index.html",locals())

        5.request.FILE的三个属性:

            filename:上传的文件名

            content_type:上传文件的Content-type

            content: 上传文件的原始内容

        6.request.POST.getlist("hobby")

        7.request.path 只会拿到路径,不会拿到数据

        8.request.full_path 拿到全路径,包括数据

        9.反向生成URL:

            django.core.urlresolvers.reverse()

            year = 2016

            url = reverse('rename',args=(year,))

            有名分组

            /index/(?P<nid>d+)/     func    name=a3

            {% url "a2" nid=11 %}

            reverse('a3',kwargs={'nid':11})

           

        10.{% for item in person_list reversed %} 反向循环

        11.正则路由url(r'^(w+)/(w+)/$', views.display_table_objs,name="table_objs"),

            view:def display_table_objs(request,app_name,table_name):

       

       -models:

        name = models.CharField(max_length=32,verbose_name='名称')

        city = models.CharField(verbose_name='城市',max_length=32)

        sex = models.BooleanField(max_length=1,choice=((0,'男'),(1,'女'),))

        website = models.URLField()

        email = models.EmailField()

        birthday = models.DateField()

        author = models.OneToOneField(Author)

        authors = models.ManyToManyField(Author)

        publisher = models.ForeignKey(Publisher)

        nid = models.AutoField(primary_key=True) 自定义自增列,默认会自动创建一个名为ID的自增列

        增:Book.objects.create(name = "ming")

            一对增加的两种方式:

                1. models.Book.objects.create(title="追风筝的人",publish_id=1) #publish_id=1

                2.pub_obj = models.Publish.objects.filter(name="人民出版社")[0]

                  models.Book.objects.create(title = "简爱",publish=pub_obj) # publish=pub_obj

        删:Book.objects.fileter(id=1).delete()

            book = models.Book.objects.fileter(id=1)

            book.Author.clear() 清空与book中id=1关联的所有数据

            book.author.remove(2) 可以为id

            book.author.remove(*[1,3,5]) 可以是列表

            反向:

            auther = models.Author.objects.filter(id=1)

            auther.book_set.clear()

           

        改:

            models.Book.objects.filter(id=3).update(title='PHP') 效率高

            多对多:

            obj=Book.objects.filter(id=1)[0]

            auther=Author.objects.filter(id_gt=2)

            obj.auther.clear() #无返回值

            obj.auther.add(*auther)

            obj.auther.remove() #有返回值

        查:

        # 查询相关API:

        #  <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

        #  <2>all():                 查询所有结果

        #  <3>get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

        #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------

        #  <4>values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列                                    

        #  <5>exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象

        #  <6>order_by(*field):      对查询结果排序

        #  <7>reverse():             对查询结果反向排序

        #  <8>distinct():            从返回结果中剔除重复纪录

        #  <9>values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

        #  <10>count():              返回数据库中匹配查询(QuerySet)的对象数量。

        # <11>first():               返回第一条记录

        # <12>last():                返回最后一条记录

        #  <13>exists():             如果QuerySet包含数据,就返回True,否则返回False。

        # 14.values 和value_list     的区别,前者返回字典,后者返回元组

            <QuerySet [{'nid': 2, 'course': 'python'}, {'nid': 24, 'course': 'python'}]> #values

            < QuerySet[(2, 'python'), (24, 'python')] > #values_list

        #15.update()                 只对queryset结果集有效,所以filter()有update方法,get()没有update的方法

        #16.delete()                  删除                  

        #datalist = models.Userinfo.objects.all().only("name","email")  #拿到的还是一个QuerySet集合,仅仅取name和email

        #datalist = models.Userinfo.objects.all().defer("name","email") #阻止,不取name和email

       

        了不起的双下划线:

        .count()获取匹配的个数

        id__lt=10,id__gt=1 #获取id大于1且小于10的

        id__in=[11,22,33] #获取id等于11,22,33的数据

        exclude(id__in=[11,22,33]) #获取id不等于11,22,33的数据

        name__contains='ven' #获取name中包含ven的数据

        name__icontains='ven' #获取name中不包含 ven的数据

        id__range=[1,2] 范围 1-2 含左不含右

        pub_data__isnull=True 是否可以为null

        .order_by('id') asc从大到小排序

        .order_by('-id') desc从小到大排序

        正则匹配 regex,iregex不区分大小写

        Entry.objects.get(title__regex=r'^(An?|The) +')

        Entry.objects.fileter(pub_data__data=datetime.date(2018,1,1)) --->date

        Entry.objects.fileter(pub_date__year=2005) -->year

       

        聚合查询和分组查询

        Book.objects.all().aggregate(Avg('price'))----->{'price__avg':34.35}

        Book.objects.aggregate(Avg('price'),Max('price'),Min('price'))

        --->{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

        分组:

        Book.objects.filter(auther__name='alex').values('title') 查询alex出的书

        Book.objects.fileter(auther__name='alex').aggregate(Sum('price')) alex出的书总价

       

        F查询和Q查询:

        from django.db.models import F

        from django.db.models import Q  导入

        F使用查询条件的值,对数值进行操作

            eg: models.Tb1.objects.update(num=F('num')+1)

        Q构建搜索条件:

            q1=models.Book.objects.filter(Q(title__starswith='P')).all()

            Q(title__starswith='P')|Q(title__starswith='J') 匹配P开头或者是J开头的title

            Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面

       

        JSONON:

            JSON.parse(str) ---> Object{"age":23,"name":"yuan"}   # 用于从一个json字符串中解析出jason对象

            var c={a:1,b:2}

            JSON.stringify(c)  -->'{"a":1,"b":2}' #用于从一个json对象解析成json字符串

        django 向js发送数据:

        def login(request):

        obj={'name':"alex111"}

        return render(request,'index.html',{"objs":json.dumps(obj)})

        #----------------------------------

        <script>

         var temp={{ objs|safe }}

         alert(temp.name);

         alert(temp['name'])

        </script>

    Ajax - javascript:   

        post 请求需要设置请求头:xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);

        XMLHTTPRequest:

        1.open(请求方式,URL,是否异步)默认异步

        2.send(请求体)

        3.onreadystatechange,指定监听函数,它会在xmlHttp对象的状态发生变化是调用

        4.readyState, 当前xmlHttp对象的状态,其中4状态便是服务器响应结束

        5.status ,服务器响应的状态码,200表示响应成功

        6.responseText, 获取服务器的响应体

        eg:

            1.function createXMLHTTPRequest()

            2.function brul(){

                xmlHttp = createXMLHTTPRequest()

                xmlHttp.onreadystatechange = function(){

                    if (xmlHttp.readyState ==4 && xmlHttp.status){

                        if (xmlHttp.responseText=="true"){

                            document.getElementById("hidden").innerText="你的用户已经存在"

                        }else{

                            document.getElementById("hidden").innerText=""

                        }

                    }

                }

                xmlHttp.open("GET","/myapp/Ajax_test/",ture,"json")

                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

                var username = document.getElementById("hide").values

                xmlHttp.sent("username="+username)

                }

    Ajax - jQuery:  

        1.$.get(url,[data],[callback],[type]) //q请求参数应该尽量放在data参数中,可以自动编码,避免手动拼接URL

        2.$.post(url,[data],[callback],[type]) //type:text|html|json|script

        $.post('myapp/student_manager/',{id:id},function(data){

            if(data == 'true'){

                document.getElementById("hidden").innerText="该用户名已经存在";

            }else{

                document.getElementById{"hidden"}.innerText="";

            }

        })

        $.ajax(function{

           

        })

          

       

       -setting配置

       LOGGING = {

        'version': 1,

        'disable_existing_loggers': False,

        'handlers': {

            'console':{

                'level':'DEBUG',

                'class':'logging.StreamHandler',

            },

        },

        'loggers': {

            'django.db.backends': {

                'handlers': ['console'],

                'propagate': True,

                'level':'DEBUG',

            },

        }

        }

       

       

    信号:

        model_signals:

        pre_init                #model对象执行其构造方法前,自动触发

        post_init               #model对象执行其构造方法之后,自动触发

        pre_save                #model对象保存前,自动触发

        post_save               #model对象保存后,自动触发

        pre_delete              #model对象删除前,自动触发

        post_delere             #model对象删除后,自动触发

        m2m_changed             #model对象使用M2M字段操作数据库中的第三张表示,自动触发

       

        managemeng_signals:

        pre_migrate             #执行migrate命令前,自动触发

        post_migrate            #执行migrate命令后,自动触发

       

        request/response_signals:

        request_startes         #请求到来前,自动触发

        request_finished        #请求结束后,自动触发

        got_request_exception   #请求异常时,自动触发

       

        test_signals:

        setting_changed         #配置文件改变时,自动触发

        template_rendered       #模板执行渲染时,自动触发

       

        Datebase_Wrapperd       #创建数据库连接时,自动触发

       

        1.在项目的 __init__.py 文件中:

            from django.db.models.signals import pre_save,post_save

            def pre_save_func(sender,**kwargs):

                print("pre_save_func")

                print("pre_save_msg:",sender,kwargs)

            def post_save_func(sender,**kwargs):

                print("post_save_func")

                print("post_save_msg:",sender,kwargs)

            pre_save.connect(pre_save_func)             # models对象保存前触发callback函数

            post_save.connect(post_save_func)           # models对象保存后触发函数

           

        2.使用装饰器触发函数:将__init__.py 中的代码修改为

            @receiver(request_finished)

            def callback(sender, **kwargs):

                print("Request finished!")

  • 相关阅读:
    python的pycharm虚拟环境问题
    Not Found: /graphql"GET /graphql HTTP/1.1" (Django)
    学习笔记257—word 第二行行首无法使用空格,是为什么?
    学习笔记256—蛋白质的合成过程及mRNA tRNA与rRNA区别
    学习笔记255—横向课题与纵向课题的区别是什么?
    1
    111
    11
    Gradle连载4依赖包打包方式 心悦君兮君不知
    [bug] MySQL错误“ERROR 2006 (HY000):MySQL server has gone away”
  • 原文地址:https://www.cnblogs.com/mihon/p/8980854.html
Copyright © 2020-2023  润新知