小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Django 千鋒培訓(xùn)的學(xué)習(xí)筆記(1)

 書*金 2018-12-13
復(fù)制代碼
Django 千鋒培訓(xùn)讀書筆記
https://www.bilibili.com/video/av17879644/?p=1





切換到創(chuàng)建項(xiàng)目的目錄  cd C:\Users\admin\Desktop\DjangoProject
創(chuàng)建名為project的項(xiàng)目命令  django-admin startproject project
            注:所有路徑不要有中文
            切換到目錄cd C:\Users\admin\Desktop\DjangoProject\project
目錄層級(jí)說(shuō)明:manage.py  一個(gè)命令行工具,可以讓我們用多種方式對(duì)Django項(xiàng)目進(jìn)行交互
             __init__.py 一個(gè)空文件,它告訴Python這個(gè)目錄應(yīng)該被看做一個(gè)包
             settings.py 項(xiàng)目的配置文件(主要處理文件)
             urls.py     項(xiàng)目的url聲明 (主要處理文件)
             wsgi.py     項(xiàng)目與WSGI兼容的Web服務(wù)器入口
配置數(shù)據(jù)庫(kù)   Django默認(rèn)使用SQLite數(shù)據(jù)庫(kù)
            在settings.py文件中通過(guò)DATABASES選項(xiàng)進(jìn)行數(shù)據(jù)庫(kù)配置
配置MySQL    Python3.x中安裝的是PyMySQL
            在__init__.py文件中寫入兩行代碼import pymysql
                                        pymysql.install_as_MySQLdb()
    以數(shù)據(jù)庫(kù)sunck為例進(jìn)行示范:對(duì)settings.py中的DATABASES進(jìn)行設(shè)置
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': "sunck",
                    'USER': "root",
                    'PASSWORD': "admin123",
                    'HOST': "localhost",
                    'PORT': "3306"
                }
            }
創(chuàng)建應(yīng)用--在一個(gè)項(xiàng)目中可以創(chuàng)建多個(gè)應(yīng)用,每個(gè)應(yīng)用進(jìn)行一種業(yè)務(wù)處理
        打開(kāi)CMD,進(jìn)入project(目錄名)的目錄下,輸入命令創(chuàng)建名為myApp的app:
            python manage.py startapp myAPP
myAPP目錄說(shuō)明
    admin.py    進(jìn)行站點(diǎn)配置
    models.py   創(chuàng)建模型
    views.py    創(chuàng)建視圖
激活應(yīng)用  在settings.py文件中,將myApp應(yīng)用加入到INSTALLED_APPS選項(xiàng)中
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'myApp',
    ]
定義模型 概述:有一個(gè)數(shù)據(jù)表就對(duì)應(yīng)有一個(gè)模型
        在models.py文件中定義模型
            引入:from django.db import models
            模型類要繼承models.Model類
            示例:
                class Grades(models.Model):
                    gname = models.CharField(max_length=20)
                    gdate = models.DateTimeField()
                    ggirlnum = models.IntegerField()
                    gboynum = models.IntegerField()
                    isDelete = models.BooleanField(default=False)

                class Students(models.Model):
                    sname = models.CharField(max_length=20)
                    sgender = models.BooleanField(default=True)
                    sage = models.IntegerField()
                    scontend = models.CharField(max_length=20)
                    isDelete = models.BooleanField(default=False)
                    sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE,)
            說(shuō)明:
                不需要定義主鍵,在生成時(shí)自動(dòng)添加,并且值為自動(dòng)增加
在數(shù)據(jù)庫(kù)中生成數(shù)據(jù)表
    生成遷移文件
        執(zhí)行 python manage.py makemigrations    在migrations目錄下生成一個(gè)遷移文件,此時(shí)數(shù)據(jù)庫(kù)中還沒(méi)有生成數(shù)據(jù)表
    執(zhí)行遷移
        執(zhí)行 python manage.py migrate           相當(dāng)于執(zhí)行MySQL語(yǔ)句創(chuàng)建了數(shù)據(jù)表

測(cè)試數(shù)據(jù)操作
進(jìn)入到python shell
    執(zhí)行 python manage.py shell
引入包
    from myApp.models import Grades, Students
    from django.utils import timezone
    from datetime import *
查詢所有數(shù)據(jù)
    類名.objects.all()
    示例: Grades.objects.all()
添加數(shù)據(jù)
    本質(zhì):創(chuàng)建一個(gè)模型類的對(duì)象實(shí)例
    示例:CMD窗口下:
        grade1 = Grades()
        grade1.gname = "python04"
        grade1.gdate = datetime(year=2017, month=7, day=17)
        grade1.ggirlnum = 3
        grade1.gboynum = 70
        grade1.save()
查看某個(gè)對(duì)象
    類名.objects(pk=索引號(hào))
    示例:
        Grades.objects.get(pk=2)
        Grades.objects.all()
修改某個(gè)數(shù)據(jù)
    模型對(duì)象屬性 = 新值
    示例:
        grade2.gboynum = 60
        grade2.save()
刪除數(shù)據(jù)
    模型對(duì)象.delete()
    grade2.delete()
    注意:這是物理刪除,數(shù)據(jù)庫(kù)中的相應(yīng)數(shù)據(jù)被永久刪除
關(guān)聯(lián)對(duì)象
    示例:
        stu = Students()
        stu.sname = "Xue Yanmei"
        stu.sgender = False
        stu.sage = 20
        stu.scontend = "I am Xue Yanmei"
        stu.sgrade = grade1
        stu.save()
    獲得關(guān)聯(lián)對(duì)象的集合
        需求:獵取python04班級(jí)的所有學(xué)生
             對(duì)象名.關(guān)聯(lián)的類名小寫_set.all()
             示例:grade1.students_set.all()
        需求:創(chuàng)建曾志偉,屬于python04班級(jí)
            示例:
                stu3 = grade1.students_set.create(sname=u'Zhen Zhiwei',sgender=True,scontend=u"I am Zhen Zhiwei",sage=45)
            注意:這樣創(chuàng)建的數(shù)據(jù)直接被添加到了數(shù)據(jù)庫(kù)當(dāng)中。
啟動(dòng)服務(wù)器:
    格式:python manage.py runserver ip:port
    注意:ip可以不寫,不寫代表本機(jī)ip
    端口號(hào)默認(rèn)是8000
    python manage.py runserver
    說(shuō)明:
        這是一個(gè)純python編寫的輕量級(jí)web服務(wù)器,僅僅在開(kāi)發(fā)測(cè)試中使用這個(gè)
Admin站點(diǎn)管理:
    概述:
        內(nèi)容發(fā)布:負(fù)責(zé)添加,修改,刪除內(nèi)容的
        公告訪問(wèn)
    配置Admin應(yīng)用:
        在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',
        這條默認(rèn)是添加好的。
    創(chuàng)建管理員用戶:
        在項(xiàng)目目錄下執(zhí)行 python manage.py createsuperuser
        依次輸入賬號(hào)名,郵箱,密碼即可完成用戶創(chuàng)建
    登陸:
        http://127.0.0.1:8000/admin/
    漢化:
        把project\settings.py
        中作如下設(shè)定:LANGUAGE_CODE = 'zh-Hans'
                     TIME_ZONE = 'Asia/Shanghai'
管理數(shù)據(jù)表:
    修改 myAPP\admin.py 如下:
        from django.contrib import admin
        # Register your models here.
        from .models import Grades, Students
        # 注冊(cè)
        admin.site.register(Grades)
        admin.site.register(Students)
    自定義管理頁(yè)面:
        屬性說(shuō)明
            # 列表頁(yè)屬性
            list_display = [] # 顯示字段設(shè)置
            list_filter = [] # 過(guò)濾字段設(shè)置
            search_fields = [] # 搜索字段設(shè)置
            list_per_page = [] # 分頁(yè)設(shè)置
            # 添加,修改頁(yè)屬性
            fields = [] # 規(guī)定屬性的先后順序
            fieldsets = [] # 給屬性分組 注意:fields與fieldsets不能同時(shí)使用
        屬性示例:
            # 列表頁(yè)屬性
            list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']
            list_filter = ['gname']
            search_fields = ['gname']
            list_per_page = 5
            # 添加,修改頁(yè)屬性
            # fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
            fieldsets = [
                ("num",{"fields":['ggirlnum', 'gboynum']}),
                ("base", {"fields":["gname", "gdate", "isDelete"]}),
            ]
        關(guān)聯(lián)對(duì)象:需求:在創(chuàng)建一個(gè)班級(jí)時(shí)可以直接添加幾個(gè)學(xué)生
            class StudentsInfo(admin.TabularInline):# 可選參數(shù)admin.StackedInline
                model = Students
                extra = 2
            class GradesAdmin(admin.ModelAdmin):
                inlines = [StudentsInfo]
        布爾值顯示問(wèn)題示例:
            class StudentsAdmin(admin.ModelAdmin):
                def gender(self):
                    if self.sgender:
                        return ""
                    else:
                        return ""
                # 設(shè)置頁(yè)面列的名稱
                gender.short_description = "性別"
                list_display = ['pk', 'sname', 'sage', gender,
                                'scontend', 'sgrade', 'isDelete']
                list_per_page = 10
            admin.site.register(Students, StudentsAdmin)
        執(zhí)行按鈕位置:
            class StudentsAdmin(admin.ModelAdmin):
                ...snip...
                actions_on_top = False
                actions_on_bottom = True
            admin.site.register(Students, StudentsAdmin)
        使用裝飾器完成注冊(cè):
            @admin.register(Students)
                class StudentsAdmin(admin.ModelAdmin):
                    def gender(self):
                    ...snip...
                    actions_on_top = False
                    actions_on_bottom = True
視圖的基本使用
    概述:
        在Django中,視圖是對(duì)web請(qǐng)求進(jìn)行回應(yīng)
        視圖就是一個(gè)python函數(shù),在views.py文件中定義。
    定義視圖:
        示例:在myApp\views.py中寫入
            from django.shortcuts import render
            # Create your views here.
            from django.http import HttpResponse
            def index(request):
                return HttpResponse("Sunck is a good man")
    配置url:方法一:path方法:
        修改project目錄下的urls.py文件:
            from django.contrib import admin
            from django.urls import path, include
            urlpatterns = [
                path('admin/', admin.site.urls),
                path('', include('myApp.urls')),
            ]
        在myApp應(yīng)用目錄下創(chuàng)建urls.py文件:
            from django.urls import path, include
            from . import views
            urlpatterns = [
                path('',views.index),
            ]
    配置url:方法二:url方法:
        修改project目錄下的urls.py文件:
            from django.contrib import admin
            from django.conf.urls import url,include
            urlpatterns = [
                url(r'^admin/', admin.site.urls),
                url(r'^', include('myApp.urls')),
            ]
        在myApp應(yīng)用目錄下創(chuàng)建urls.py文件:
            from django.conf.urls import url
            from . import views
            urlpatterns = [
                url(r'^$', views.index),
            ]
模板的基本使用:
    概述:模板是HTML頁(yè)面,可以根據(jù)視圖中傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行填充
    創(chuàng)建模板:
        創(chuàng)建templates目錄,在目錄下創(chuàng)建對(duì)應(yīng)項(xiàng)目的模板目錄(project/templates/myApp)
    配置模板路徑:
        修改settings.py文件下的TEMPLATES下的'DIRS''DIRS': [os.path.join(BASE_DIR, 'templates')],
    定義grades.html與students.html模板:
        在templates\myApp\目錄下創(chuàng)建grades.html與students.html模板文件
        模板語(yǔ)法:
            {{輸出值,可以是變量,也可以是對(duì)象,屬性}}
            {%執(zhí)行代碼段%}
    http://127.0.0.1:8000/grades
        寫grades.html模板:
            <!doctype html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport"
                      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
                <meta http-equiv="X-UA-Compatible" content="ie=edge">
                <title>班級(jí)信息</title>
            </head>
            <body>
                <h1>班級(jí)信息列表</h1>
                <ul>
                    <!--[python04, python05, python06]-->
                    {%for grade in grades%}
                    <li>
                        <a href="#">{{grade.gname}}</a>
                    </li>
                    {%endfor%}
                </ul>
            </body>
            </html>
        定義視圖:myApp\views.py
            from .models import Grades
            def grades(request):
                # 去模板里取數(shù)據(jù)
                gradesList = Grades.objects.all()
                # 將數(shù)據(jù)傳遞給模板,模板再渲染頁(yè)面,將渲染好的頁(yè)面返回給瀏覽器
                return render(request, 'myApp/grades.html', {"grades": gradesList})
        配置url:myApp\urls.py
        urlpatterns = [
            url(r'^$', views.index),
            url(r'^(\d+)/(\d+)$', views.detail),
            url(r'^grades/', views.grades)
        ]
    http://127.0.0.1:8000/students
        寫students.html模板
            <!doctype html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport"
                      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
                <meta http-equiv="X-UA-Compatible" content="ie=edge">
                <title>學(xué)生頁(yè)面</title>
            </head>
            <body>
                <h1>學(xué)生信息列表</h1>
                <ul>
                    {%for student in students%}
                    <li>
                        {{student.sname}}--{{student.scontend}}
                    </li>
                    {%endfor%}
                </ul>
            </body>
            </html>
        定義視圖:myApp\views.py
            from .models import Students
            def students(request):
                studentsList = Students.objects.all()
                return render(request, 'myApp/students.html', {"students": studentsList})
        配置url:myApp\urls.py
            urlpatterns = [
            url(r'^$', views.index),
            url(r'^(\d+)/(\d+)$', views.detail),
            url(r'^grades/', views.grades),
            url(r'^students/', views.students),
        ]
    需求:點(diǎn)擊班級(jí),顯示對(duì)應(yīng)班級(jí)的學(xué)生名字
        運(yùn)行不正常https://www.bilibili.com/video/av17879644/?p=12






Django流程梳理
    創(chuàng)建工程:執(zhí)行 django-admin startproject 工程名
    創(chuàng)建項(xiàng)目:執(zhí)行 python manage.py startapp 項(xiàng)目名稱
    激活項(xiàng)目:修改 settings.py中的INSTALLED_APPS
    配置數(shù)據(jù)庫(kù):
        修改__init__.py文件
        修改settings.py文件中的DATABASES
    創(chuàng)建模型類:在項(xiàng)目目錄下的models.py文件中創(chuàng)建
    生成遷移文件:執(zhí)行python manage.py makemigrations
    執(zhí)行遷移:執(zhí)行python manage.py migrate
    配置站點(diǎn):略
    創(chuàng)建模板目錄/項(xiàng)目模板目錄
    在settings.py中的TEMPLATES添加templates路徑
    在工程目錄下(project)修改urls.py
    在項(xiàng)目目錄下創(chuàng)建urls.py


使用他人Django代碼需要的簡(jiǎn)易修改:
1.在settings.py中修改數(shù)據(jù)庫(kù)名
2.在settings.py中修改數(shù)據(jù)庫(kù)密碼
3.刪除由內(nèi)向外文件(在對(duì)應(yīng)目錄里鼠標(biāo)右鍵刪除)
4.在數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)第一步的數(shù)據(jù)庫(kù)(自己在SQL中創(chuàng)建)
5.執(zhí)行生成遷移文件
6.執(zhí)行遷移
7.啟動(dòng)服務(wù)
8.瀏覽器測(cè)試


Django模型
    Django對(duì)各種數(shù)據(jù)庫(kù)提供了很好的支持,Django為這些數(shù)據(jù)庫(kù)提供了統(tǒng)一的調(diào)用API
    我們可以根據(jù)不同的業(yè)務(wù)需求選擇不同的數(shù)據(jù)庫(kù)。
    配置數(shù)據(jù)庫(kù)
        修改工程目錄下的__init__.py文件
            import pymysql
            pymysql.install_ad_MySQLdb()
        修改settings.py文件中的DATABASES
    開(kāi)發(fā)流程
        配置數(shù)據(jù)庫(kù)
        定義模型類:一個(gè)模型都在數(shù)據(jù)庫(kù)中對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表
        生成遷移文件
        執(zhí)行遷移生成數(shù)據(jù)表
        使用模型類進(jìn)行增刪改查
    ORM
        概述:對(duì)象-關(guān)系-映射
        任務(wù):
            根據(jù)對(duì)象的類型生成表結(jié)構(gòu)
            將對(duì)象,列表的操作轉(zhuǎn)換成SQL語(yǔ)句
            將SQL語(yǔ)句查詢到的結(jié)果轉(zhuǎn)換為對(duì)象,列表
        優(yōu)點(diǎn):
            極大的減輕了開(kāi)發(fā)人員的工作量,不需要面對(duì)因數(shù)據(jù)庫(kù)的變更而修改代碼的問(wèn)題
    定義模型
        模型,屬性,表,字段之間的關(guān)系
            一個(gè)模型類在數(shù)據(jù)庫(kù)中對(duì)應(yīng)一張表,在模型類中定義的屬性,對(duì)應(yīng)該模型對(duì)照表中的一個(gè)字段
        定義屬性:見(jiàn)下文
        創(chuàng)建模型類
        元選項(xiàng)
            在模型類中定義Meta類,用于設(shè)置元信息
            示例:
                class Meta:
                    db_table = "students"
                    ordering = ['id']
            db_table
                定義數(shù)據(jù)表名,推薦用小寫字母,數(shù)據(jù)表名默認(rèn)為項(xiàng)目名小寫_類名小寫
            ordering
                對(duì)象的默認(rèn)排序字段,獲取對(duì)象的列表時(shí)使用
                示例:
                    ordering['id'] id按升序排列
                    ordering['-id'] id按降序排列
                注意:排序會(huì)增加數(shù)據(jù)庫(kù)開(kāi)銷
    模型成員
        類屬性
            隱藏類屬性objects:
                是Manager類型的一個(gè)對(duì)象,作用是與數(shù)據(jù)庫(kù)進(jìn)行交互
                當(dāng)定義模型類時(shí)沒(méi)有指定管理器,則Django為模型創(chuàng)建一個(gè)名為objects的管理器
            自定義管理器示例:
                定義stuObj管理器:
                    stuObj = models.Manager()
                當(dāng)為模型指定模型管理器,Django就不再為模型類生成objects模型管理器了。
            自定義管理器Manager類
                模型管理器是Django的模型進(jìn)行與數(shù)據(jù)庫(kù)交互的窗口,一個(gè)模型可以有多個(gè)模型管理器
                作用:
                    向管理器類中添加額外的方法
                    修改管理器返回的原始查詢集
                        通常會(huì)重寫get_queryset()方法
                代碼示例:
                    class StudentsManager(models.Manager):
                        def get_queryset(self):
                            return super(StudentsManger, self).get_queryset().filter(isDelete=False)

                    class Students(model.Moder):
                        # 自定義模型管理器
                        # 當(dāng)自定義模型管理器,objects就不存在了
                        stuObj = models.Manger()
                        stuObj2 = StudentsManager()

        創(chuàng)建對(duì)象
            目的:向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)
            當(dāng)創(chuàng)建對(duì)象時(shí),django不會(huì)對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫操作,當(dāng)調(diào)用save()方法時(shí)才與數(shù)據(jù)庫(kù)交互,將對(duì)象保存在數(shù)據(jù)庫(kù)表中。
            注意:
                __init__方法已經(jīng)在父類models.Model中使用,在自定義的模型中無(wú)法使用。
            方法:
                在模型類中增加一個(gè)類方法,示例如下:
                    class Students(model.Moder):
                        ...snip...
                         @classmethod
                        def createStudent(cls, name, age, gender, contend,
                                          grade,lastT, createT, isD=False):
                            stu = cls(sname=name, sage=age, sgender=gender,
                                        scontend=contend, sgrade=grade, lastTime=lastT, createTime=createT,
                                        isDelete=isD)
                            return stu
                在自定義管理器中添加一個(gè)方法,示例如下:
                    class StudentsManager(models.Manager):
                        def get_queryset(self):
                            return super(StudentsManager, self).get_queryset().filter(isDelete=False)
                        def createStudent(self, name, age, gender, contend, grade, lastT, createT, isD=False):
                            stu = self.model()
                            # print(type(grade))
                            stu.sname = name
                            stu.sage = age
                            stu.sgender = gender
                            stu.scontend = contend
                            stu.sgrade = grade
                            stu.lastTime = lastT
                            stu.createTime = createT
                            return stu
        模型查詢
            概述
                查詢集表示從數(shù)據(jù)庫(kù)獲取的對(duì)象的集合
                查詢集可以有多個(gè)過(guò)濾器
                過(guò)濾器就是一個(gè)函數(shù),基于所給的參數(shù)限制查詢集結(jié)果
                從SQL角度來(lái)說(shuō),查詢集和select語(yǔ)句等價(jià),過(guò)濾器就像where條件
            查詢集
                在管理器上調(diào)用過(guò)濾器方法返回查詢集
                查詢集經(jīng)過(guò)過(guò)濾器篩選后返回新的查詢集,所以可以寫成鏈?zhǔn)秸{(diào)用
                惰性執(zhí)行
                    創(chuàng)建查詢集不會(huì)帶來(lái)任何數(shù)據(jù)庫(kù)的訪問(wèn),直到調(diào)用數(shù)據(jù)庫(kù)時(shí),才會(huì)訪問(wèn)數(shù)據(jù)
                直接訪問(wèn)數(shù)據(jù)的情況:
                    迭代
                    序列化
                    與if合用
                返回查詢集的方法稱為過(guò)濾器
                    all():返回查詢集中的所有數(shù)據(jù)
                    filter():保留符合條件的數(shù)據(jù)
                        filter(鍵=值)
                        filter(鍵=值,鍵=值)
                        filter(鍵=值).filter(鍵=值)   且的關(guān)系
                    exclude():過(guò)濾掉符合條件的
                    order_by():排序
                    values():一條數(shù)據(jù)就是一個(gè)字典,返回一個(gè)列表
                    get()
                        返回一個(gè)滿足條件的對(duì)象
                        注意:
                            如果沒(méi)有找到符合條件的對(duì)象,會(huì)引發(fā)模型類.DoesNotExist異常
                            如果找到多個(gè)對(duì)象,會(huì)引發(fā)模型類MultipleObjectsReturned異常
                    count():返回查詢集中對(duì)象的個(gè)數(shù)
                    first():返回查詢集中第一個(gè)對(duì)象
                    last():返回查詢集中最后一個(gè)對(duì)象
                    exits():判斷查詢集中是否有數(shù)據(jù),如果有數(shù)據(jù)返回 True,否則返回 False.
                限制查詢集
                    查詢集返回列表,可以使用下標(biāo)的方法進(jìn)行限制,等同于sql中的limit語(yǔ)句
                    注意:下標(biāo)不能是負(fù)數(shù)
                    示例:studentsList = Students.stuObj2.all()[0:5]
                查詢集的緩存
                    概述:
                        每個(gè)查詢集都包含一個(gè)緩存,來(lái)最小化對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)
                        在新建的查詢集中,緩存首次為空,第一次對(duì)查詢集求值,會(huì)發(fā)生數(shù)據(jù)緩存,Django會(huì)將查詢出來(lái)的數(shù)據(jù)做一個(gè)緩存,并返回查詢結(jié)果。
                        以后的查詢直接使用查詢集的緩存
                字段查詢
                    概述
                        實(shí)現(xiàn)了sql中的where語(yǔ)句,作為方法filter(),exclude(),get()的參數(shù)
                        語(yǔ)法:屬性名稱__比較運(yùn)算符=值
                        外鍵:屬性名稱_id
                        轉(zhuǎn)義:類似sql中的like語(yǔ)句
                             like有關(guān)情況看我哥他%是為了匹配點(diǎn)位,匹配數(shù)據(jù)中的%使用(where like "\%")
                             filter(sname__contains="%")
                    比較運(yùn)算符
                        exact:判斷,大小寫敏感
                            filter(isDelete=False)
                        contains:是否包含,大小寫敏感
                            studentsList = Students.stuObj2.filter(sname__contains="")
                        startswith,endswith:以value開(kāi)頭或結(jié)尾,大小寫敏感
                        以上四個(gè)在前面加上i,就表示不區(qū)分大小寫iexact,icontains,istartswith,iendswith
                        isnull,isnotnull
                            是否為空
                            filter(sname__isnull=False)
                        in:是否包含在范圍內(nèi)
                        gt大于,gte大于等于,lt小于,lte小于等于
                        year,month,day,week_day,hour,minute,second
                            studentsList = Students.stuObj2.filter(lastTime__year=2017)
                        跨關(guān)聯(lián)查詢
                            處理join查詢
                                語(yǔ)法:
                                    模型類名__屬性名__比較運(yùn)算符
                                    # 描述中帶有‘薛延美’這三個(gè)字的數(shù)據(jù)是屬于哪個(gè)班級(jí)的
                                    grade = Grades.objects.filter(students__scontend__contains='薛延美')
                                    print(grade)
                            查詢快捷pk代表的主鍵
                        聚合函數(shù)
                            使用aggregate函數(shù)返回聚合函數(shù)的值
                            Avg
                            Count
                            Max
                                maxAge = Student.stuObj2.aggregate(Max('sage'))
                                maxAge為最大的sage。
                            Min
                            Sum
                        F對(duì)象
                            可以使用模型的A屬性與B屬性進(jìn)行比較
                            from django.db.models import F,Q
                            def grades1(request):
                                g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))
                                print(g)
                                # [<Grades: python02>,<Grades: python03>]
                                return HttpResponse("OOOOOOOo")
                            支持F對(duì)象的算術(shù)運(yùn)算
                                g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
                        Q對(duì)象
                            概述:過(guò)濾器的方法的關(guān)鍵字參數(shù),條件為And模式
                            需求:進(jìn)行or查詢
                            解決:使用Q對(duì)象
                                def students4(request):
                                    studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))
                                    return render(request, 'myApp/students.html', {"students": studentsList})
                                只有一個(gè)Q對(duì)象的時(shí)候,就是用于正常匹配條件
                                studentsList = Students.stuObj2.filter(~Q(pk__lte=3))
                                ~Q是取反


定義屬性
    概述:
        django根據(jù)屬性的類型確定以下信息
            當(dāng)前選擇的數(shù)據(jù)庫(kù)支持字段的類型
            渲染管理表單時(shí)使用的默認(rèn)html控件
            在管理站點(diǎn)最低限度的驗(yàn)證

        django會(huì)為表增加自動(dòng)增長(zhǎng)的主鍵列,每個(gè)模型只能有一個(gè)主鍵列,如
        果使用選項(xiàng)設(shè)置某屬性為主鍵列后,則django不會(huì)再生成默認(rèn)的主鍵列

        屬性命名限制
            遵循標(biāo)識(shí)符規(guī)則,且變量不能與Python保留字相同
            由于django的查詢方式,不允許使用連續(xù)的下劃線

    庫(kù)
        定義屬性時(shí),需要字段類型,字段類型被定義在django.db.models.fields目錄下,
        為了方便使用,被導(dǎo)入到django.db.models中

        使用方式
            導(dǎo)入: from django.db import models
            通過(guò) models.Field創(chuàng)建字段類型的對(duì)象,賦值給屬性

    邏輯刪除
        對(duì)于重要類型都做邏輯刪除,不做物理刪除,實(shí)現(xiàn)方法是定義idDelete屬性,
        類型為BooleanField,默認(rèn)值為False

    字段類型
        autoField
            一個(gè)根據(jù)實(shí)際ID自動(dòng)增長(zhǎng)的IntegerField,通常不指定,
            如果不指定,一個(gè)主鍵字段將自動(dòng)添加到模型中

        CharField(max_length=字符長(zhǎng)度)
            字符串,默認(rèn)的表彰樣式是TextInput

        TextField
            大文本字段,一般超過(guò)4000時(shí)使用,默認(rèn)的表單控件是Textarea

        IntegerField
            整數(shù)

        DecimalField(max_digits=None, decimal_places=None)
            使用Python的Decimal實(shí)例表示的十進(jìn)制浮點(diǎn)數(shù)
            參數(shù)說(shuō)明
                DecimalField.max_digits
                    位數(shù)總數(shù)
                DecimalField.decimal_places
                    小數(shù)點(diǎn)后的數(shù)字位置

        FloatField
            使用Python的float實(shí)例來(lái)表示的浮點(diǎn)數(shù)

        BooleanField
            True/False 字段,此字段的默認(rèn)表彰控制是CheckboxInput

        NullBooleanField
            支持 Null, True, False 三種值

        DateField([auto_now=False, auto_now_add=False])
            使用Python的datetime.date實(shí)例表示的日期
            參數(shù)說(shuō)明:
                DateField.auto_now
                    每次保存對(duì)象時(shí),自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間,用于“最后一次修改”
                    的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為 False
                DateField.auto_now_add
                    當(dāng)前對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間,用于創(chuàng)建的時(shí)間戳,
                    它總是使用當(dāng)前日期,默認(rèn)為 False
            說(shuō)明
                該字段默認(rèn)對(duì)應(yīng)的表單控件是一個(gè)TextInput.在管理員站點(diǎn)添加了一個(gè)
                JavaScript寫的日歷控件,和一個(gè)“Today”的快捷按鈕,包含了一個(gè)額外
                的invalid_date錯(cuò)誤消息鍵
            注意
                auto_now_add, auto_now, and default 這些設(shè)置是相互排斥的,他們之間
                的任何組合將會(huì)發(fā)生錯(cuò)誤的結(jié)果

        TimeField
            使用Python的datetime.time實(shí)例表示的時(shí)間,參數(shù)同DateField

        DateTimeField
            使用Python的datetime
            datetime實(shí)例表示的日期和時(shí)間,參數(shù)同DateField

        FileField
            一個(gè)上傳文件的字段

        ImageField
            繼承了FileField的所有屬性和方法,但對(duì)上傳的對(duì)象進(jìn)行校驗(yàn),
            確保它是一個(gè)有效的image

    字段選項(xiàng)
        概述
            通過(guò)字段選項(xiàng),可以實(shí)現(xiàn)對(duì)字段的約束
            在字段對(duì)象中通過(guò)關(guān)鍵字參數(shù)指定

        null
            如果為True,Django將空值以NULL存儲(chǔ)在數(shù)據(jù)庫(kù)中,默認(rèn)值為 False

        blanke
            如果為True,則該字段允許為空白,默認(rèn)值為 False

        注意
            null是數(shù)據(jù)庫(kù)范疇的概念,blank是表彰驗(yàn)證范疇的概念

        db_column
            字段的名稱,如果未指定,則使用屬性的名稱

        db_index
            若值為 True,則在表中會(huì)為此字段創(chuàng)建索引

        default
            默認(rèn)值

        primary_key
            若為 True,則該字段會(huì)成為模型的主鍵字段

        unique
            如果為 True,這個(gè)字段在表中必須有唯一值

    關(guān)系
        分類
            ForeignKey:一對(duì)多,將字段定義在多的端中
            ManyToManyField:多對(duì)多,將字段定義在兩端中
            OneToOneField:一對(duì)一,將字段定義在任意一端中

        用一訪問(wèn)多
            格式
                對(duì)象.模型類小寫_set
            示例
                grade.students_set

        用一訪問(wèn)一
            格式
                對(duì)象.模型類小寫
            示例
                grade.studnets

        訪問(wèn)id
            格式
                對(duì)象.屬性_id
            示例
                student.sgrade_id


視圖
    概述:
        作用:視圖接收web請(qǐng)求,并響應(yīng)web請(qǐng)求
        本質(zhì):視圖就是python中的一個(gè)函數(shù)
        響應(yīng):
            響應(yīng)過(guò)程:
                用戶在瀏覽器中輸入網(wǎng)址www.sunck.wang/sunck/index.html
                ---網(wǎng)址--->
                django獲取網(wǎng)址信息,去掉IP與端口號(hào),網(wǎng)址變成:sunck/index.html
                ---虛擬路徑與文件名--->
                url管理器逐個(gè)匹配urlconf,記錄視圖函數(shù)
                ---視圖函數(shù)名--->
                視圖管理,找到對(duì)應(yīng)的視圖去執(zhí)行,返回結(jié)果給瀏覽器
                ---響應(yīng)的數(shù)據(jù)--->
                返回第一步:用戶在瀏覽器中輸入網(wǎng)址
            網(wǎng)頁(yè)
                重定向
                錯(cuò)誤視圖
                    404視圖:找不到網(wǎng)頁(yè)(url匹配不成功時(shí)返回)時(shí)返回
                        在templates目錄下定義404.html
                            <!doctype html>
                            <html lang="en">
                            <head>
                                <meta charset="UTF-8">
                                <meta name="viewport"
                                      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
                                <meta http-equiv="X-UA-Compatible" content="ie=edge">
                                <title>Document</title>
                            </head>
                            <body>
                                <h1>頁(yè)面丟失</h1>
                                <h2>{{request_path}}</h2>
                            </body>
                            </html>
                            request_path:導(dǎo)致錯(cuò)誤的網(wǎng)址
                        配置settings.py
                            DEBUG
                                如果為 True,永遠(yuǎn)不會(huì)調(diào)用404頁(yè)面,需要調(diào)整為 False 才會(huì)顯示
                            ALLOWED_HOSTS = ['*']
                    500視圖:在視圖代碼中出現(xiàn)錯(cuò)誤(服務(wù)器代碼錯(cuò)誤)
                    400視圖:錯(cuò)誤出現(xiàn)在客戶的操作
            JSON數(shù)據(jù)
    url配置
        配置流程:
            制定根級(jí)url配置文件
                settings.py文件中的ROOT_URLCONF
                ROOT_URLCONF = 'project.urls'
                默認(rèn)實(shí)現(xiàn)了
            urlpatterns
                一個(gè)url實(shí)例的列表
                url對(duì)象
                    正則表達(dá)式
                    視圖名稱
                    名稱
            url匹配正則的注意事項(xiàng)
                如果想要從url中獲取一個(gè)值,需要對(duì)正則加小括號(hào)
                匹配正則前方不需要加'/'
                正則前需要加'r'表示字符串不轉(zhuǎn)義
        引入其他url配置
            在應(yīng)用中創(chuàng)建urls.py文件,定義本應(yīng)用的url配置,在工程urls.py中使用include方法
                project\urls.py
                from django.contrib import admin
                from django.conf.urls import url,include
                urlpatterns = [
                    url(r'^admin/', admin.site.urls),
                    url(r'^', include('myApp.urls', namespace="myAPP")),
                ]
                myApp\urls.py
                from django.urls import path, include
                from django.conf.urls import url
                from . import views
                urlpatterns = [
                    url(r'^$', views.index, name="index"),
                ]
        url的反向解析
            概述:如果在視圖,模板中使用了硬編碼鏈接,在url配置發(fā)生改變時(shí),動(dòng)態(tài)生成鏈接的地址
            解決:在使用鏈接時(shí),通過(guò)url配置的名稱,動(dòng)態(tài)生成url地址
            作用:使用url模板
    視圖函數(shù)
        定義視圖:
            本質(zhì):一個(gè)函數(shù)
            視圖參數(shù):
                一個(gè)HttpRequest的實(shí)例
                通過(guò)正則表達(dá)式獲取的參數(shù)
            位置:一般在views.py文件下定義
    HttpRequest對(duì)象
        概述:
            服務(wù)器接收http請(qǐng)求后,會(huì)根據(jù)報(bào)文創(chuàng)建HttpRequest對(duì)象
            視圖的第一個(gè)參數(shù)就是HttpRequest對(duì)象
            django創(chuàng)建的,之后調(diào)用視圖時(shí)傳遞給視圖
        屬性
            path:請(qǐng)求的完整路徑(不包括域名和端口)
            method:表示請(qǐng)求的方式,常用的有GET,POST
            encoding:表示瀏覽器提交的數(shù)據(jù)的編碼方式,一般為utf-8
            GET:類似于字典的對(duì)象,包含了get請(qǐng)求的所有參數(shù)
            POST:類似于字典的對(duì)象,包含了post請(qǐng)求的所有參數(shù)
            FILES:類似字典的對(duì)象,包含了所有上傳的文件
            COOKIES:字典,包含所有的cookie
            session:類似字典的對(duì)象,表示當(dāng)前會(huì)話
        方法
            is_ajax():如果是通過(guò)XMLHttpRequest發(fā)起的,返回 True
        QueryDict對(duì)象
            request對(duì)象中的GET,POST都屬于QueryDict對(duì)象
            方法:
                get():
                    根據(jù)鍵獲取值,只能獲取一個(gè)值
                    www.sunck.wang/abc?a=1&b=2&c=3
                getlist()
                    將鍵的值以列表的形式返回
                    可以獲取多個(gè)值
                    www.sunck.wang/abc?a=1&b=2&c=3
        GET屬性
            獲取瀏覽器傳遞過(guò)來(lái)數(shù)據(jù)
            www.sunck.wang/abc?a=1&b=2&c=3
            urls.py
            url(r'^get1', views.get1),   #結(jié)尾不能加$,否則無(wú)法匹配
            views.py
            def get1(request):
                a = request.GET.get('a')
                b = request.GET.get('b')
                c = request.GET.get('c')
                return HttpResponse(a + " " + b + " " + c)

            www.sunck.wang/abc?a=1&a=2&c=3
            urls.py
            url(r'^get2', views.get2),
            views.py
            def get2(request):
                a = request.GET.getlist('a')
                a1 = a[0]
                a2 = a[1]
                c = request.GET.get('c')
                return HttpResponse(a1 + " " + a2 + " " + c)
        POST屬性
            使用表單模擬POST請(qǐng)求
            關(guān)閉CSRF:project\project\settings.py
                MIDDLEWARE = [
                    'django.middleware.security.SecurityMiddleware',
                    'django.contrib.sessions.middleware.SessionMiddleware',
                    'django.middleware.common.CommonMiddleware',
                    # 'django.middleware.csrf.CsrfViewMiddleware',
                    'django.contrib.auth.middleware.AuthenticationMiddleware',
                    'django.contrib.messages.middleware.MessageMiddleware',
                    'django.middleware.clickjacking.XFrameOptionsMiddleware',
                ]
            示例:
                def showregist(request):
                    return render(request, 'myApp/regist.html',)

                def regist(request):
                    name = request.POST.get("name")
                    gender = request.POST.get("gender")
                    age = request.POST.get("age")
                    hobby = request.POST.getlist("hobby")
                    print(name)
                    print(gender)
                    print(age)
                    print(hobby)
                    return HttpResponse("regist")
            路徑:
                url(r'^showregist/$', views.showregist),
                    url(r'^showregist/regist/$', views.regist),
            頁(yè)面:
                   <!doctype html>
                <html lang="en">
                <head>
                    <meta charset="UTF-8">
                    <meta name="viewport"
                          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
                    <meta http-equiv="X-UA-Compatible" content="ie=edge">
                    <title>注冊(cè)</title>
                </head>
                <body>
                    <form action="regist/" method="post">
                        姓名:<input type="text" name="name" value=""/>
                        <hr>
                        性別:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女
                        <hr>
                        愛(ài)好:<input type="checkbox" name="hobby" value="power"/>權(quán)利<input type="checkbox" name="hobby" value="money">金錢<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla
                        <hr>
                        <input type="submit" value="注冊(cè)">
                    </form>
                </body>
                </html>
    HttpResponse對(duì)象
        概述:
            作用:給瀏覽器返回?cái)?shù)據(jù)
            HttpRequest對(duì)象是由Django創(chuàng)建的,HttpResponse對(duì)象是由程序員創(chuàng)建
        用法:
            不用模板,直接返回?cái)?shù)據(jù)
                語(yǔ)句示例:return HttpResponse("Sunck is a good man")
            調(diào)用模板
                使用render方法
                    原型:render(request, templateName[, context])
                    作用:結(jié)合數(shù)據(jù)和模板,返回一個(gè)完整的HTML頁(yè)面
                    參數(shù):
                        request:請(qǐng)求體對(duì)象
                        templateName:模板路徑
                        context:傳遞給需要渲染在模板上的數(shù)據(jù)
        屬性
            content:表示返回內(nèi)容
            charset:編碼格式
            status_code:響應(yīng)狀態(tài)碼
                200
                304
                404
                400
            content-type:指定輸出的MIME類型
        方法
            init:使用頁(yè)面內(nèi)容實(shí)例化HttpResponse對(duì)象
            write(content):以文件的形式寫入
            flush():以文件的形式輸出緩沖區(qū)
            set_cookie(key, value, maxAge=None, exprise=None)
            delete_cookie(key):
                刪除cookie
                如果刪除一個(gè)不存在的cookie,就當(dāng)什么都沒(méi)發(fā)生
        子類HttpResponseRedirect
            功能:重定向,服務(wù)器端的跳轉(zhuǎn)
            簡(jiǎn)寫
                redirect(to)
            to推薦使用反向解析
            示例:
                from django.http import HttpResponseRedirect
                from django.shortcuts import redirect
                def redirect1(request):
                    # return HttpResponseRedirect('/redirect2')
                    return redirect('/redirect2')
                def redirect2(request):
                    return HttpResponse("我是重定向后的視圖")
        子類JsonResponse
            返回Json數(shù)據(jù),一般用于異步請(qǐng)求
            __init__(self.data)
            data 字典
            注意:Content-type類型為application/json
    狀態(tài)保持
        http協(xié)議是無(wú)狀態(tài)的,每次請(qǐng)求都是一次新的請(qǐng)求,它不記得之前的請(qǐng)求。
        客戶端與服務(wù)器的一次通信就是一次會(huì)話
        實(shí)現(xiàn)狀態(tài)的保持,在客戶端或服務(wù)端存儲(chǔ)有關(guān)會(huì)話的數(shù)據(jù)
        存儲(chǔ)的方式
            cookie:所有數(shù)據(jù)存儲(chǔ)在客戶端,不要存儲(chǔ)敏感的數(shù)據(jù)
            session:所有的數(shù)據(jù)存儲(chǔ)在服務(wù)端,在客戶端用cookie存儲(chǔ)session_id
        狀態(tài)保持的目的:
            在一段時(shí)間內(nèi)跟蹤請(qǐng)求者的狀態(tài),可以實(shí)現(xiàn)跨頁(yè)面訪問(wèn)當(dāng)前的請(qǐng)求者的數(shù)據(jù)
        注意:不同的請(qǐng)求者之間不會(huì)共享這個(gè)數(shù)據(jù),與請(qǐng)求者一一對(duì)應(yīng)
        啟用session:project\project\settings.py
            INSTALLED_APPS    'django.contrib.sessions',
            MIDDLEWARE    'django.contrib.sessions.middleware.SessionMiddleware',
        使用session
            啟用session后,每個(gè)httpRequest對(duì)象都有一個(gè)session屬性
            get[key, default=None]    根據(jù)鍵獲取session值
            clear()    清空所有會(huì)話
            flush()    刪除當(dāng)前會(huì)話并刪除會(huì)話的cookie
            示例:
                # session
                def main(request):
                    # 取session
                    username = request.session.get('name', '游客')
                    print(username)
                    return render(request, 'myApp/main.html', {'username': username})

                def login(request):
                    return render(request, 'myApp/login.html')

                def showmain(request):
                    print("*****************")
                    username = request.POST.get('username')
                    # 存儲(chǔ)session
                    request.session['name'] = username
                    return redirect('/main/')

                from django.contrib.auth import logout
                def quit(request):
                    # 清除session
                    logout(request) # 方法1,推薦
                    # request.session.clear() # 方法2
                    request.session.flush() # 方法3
                    return redirect('/main/')
        設(shè)置session過(guò)期時(shí)間
            set_expiry(value)
            request.session.set_expiry(10)  設(shè)置為10秒后過(guò)期
            如果不設(shè)置,2個(gè)星期后過(guò)期
            value設(shè)置為0代表關(guān)閉瀏覽器時(shí)過(guò)期
            value設(shè)置為None代表設(shè)置永不過(guò)期,不推薦

Redis使用:略
復(fù)制代碼

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多