第三階段:Django框架 day55 Django--Django框架深刻學習

Django框架深刻應用html

1. 前期回顧

咱們前期基於wsgiref、urls和views的映射關係簡單介紹了web的框架,以後初步介紹了Django的使用。python

如今咱們將真正用Django實現一個項目的功能框架,接下來,先簡單介紹一下總體的框架。mysql

開始吧!web

2. 登陸功能

咱們在完成一個完整的項目以前,首先經過實現單個功能認識整個項目的框架與各個文件的做用,好比登陸功能。sql

  • 第一步 —— 建立Django項目數據庫

  • 第二步 —— urls.py文件創建關係django

  • 第三步 —— views.py文件定義視圖函數(某個功能)json

  • 第四步 —— 項目名內的settings.py文件配置靜態文件bootstrap

    • 解析第一步:前三步是基本步驟,第四步由於登陸功能須要區分瀏覽器的POST/GET命令,以後校驗用戶的用戶名和密碼,返回頁面。
    • 解析第二步:返回的頁面用到了redirect(重定向)render(request,'xx.html', {{'msg': ...}})命令。那麼頁面的css文件能夠使用bootstrap,img等等,就須要配置靜態文件。
  • 第五步 —— 用戶信息與數據庫校驗與存放

    • 解析第一步:鏈接數據庫,settings.py配置數據庫(數據庫文件遷移)
    • 解析第二步:Django自帶小型sqlite數據庫
  • 第六步 —— 利用models.py建立數據庫表(至關於Django的orm)

    • 解析第一步:orm的優勢咱們已經知道,小白也可快速上手。但也有缺點,就是orm的封裝性太好,使得使用效率下降。
    • 解析第二步:一個Django項目最好用一個數據庫。
  • 第七步 —— 表字段及數據的增刪查改

2.1 建立Django項目

  • 命令行:django-admin startproject django項目名稱
  • pycharm建立:new project ——>Django

2.2 創建映射關係(urls.py)

for example:

urlpatterns = [    
    url(r'^admin/', admin.site.urls),                    
    url(r'^register/', views.register),           
    url(r'^login/', views.login),    
    url(r'^get_time/', views.get_time),    
    url(r'^get_user/', views.get_user),    
    url(r'^get_db/', views.get_db),
]

2.3 定義視圖函數(views.py)

一一對應urls.py:

def admin(request):
    pass

def register(request):
    pass

def login(request):
    pass

def get_time(request):
    pass

def get_user(request):
    pass

def get_db(request):
    pass

2.4 靜態文件配置(settings.py)

STATIC_URL = '/static/'  #接口訪問密碼,html導入靜態文件樣式的前綴
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  #靜態文件夾的名字
)

2.5 數據庫鏈接與校驗(涉及render / redirect / HttpResponse)

2.5.1 DATABASE配置

第一步:settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'np1',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

第二步:__init__.py

import pymysql
pymysql.install_as_MySQLdb()

注意一:原先的pymysql的另外一種形式,在Django的settings.py裏面有默認鏈接數據庫配置。

注意二:數據庫的數據遷移 —— python manage.py dumpdata —— data.json(和migrations/migrate作區別)

2.5.2 render/redirect/Httpresponse

  • redirect(重定向) —— 跳轉頁面
  • render(request,'xx.html', {{'msg': ...}}) —— 傳遞數據/網址/信息等
  • HttpResponse() —— 返回字符串

注意:Django返回的都是HttpResponse的對象,由於這裏的HttpResponse是一個類,上面三個默認繼承這個類。

2.6 Django的orm(models.py)

第一步:Userinfo表

class Userinfo(models.Model):
    username = models.CharField(max_length=64, null=True)
    password = models.IntegerField()

注意:不建立庫,只建立表。

第二步:生成表單語句

  • 在命令行進行操做
    • python manage.py makemigrations —— 不會真正地操做數據,只是將記錄放在migrations文件夾下
    • python manmge.py migrate —— 真正地將記錄同步到數據庫中

注意一:每一次增刪查改都要來一次
注意二:第一次執行上面兩條命令時,Django會建立不少表,裏面有不少是默認的Django須要用的表。
注意二:本身寫的模型類對應的表,表名有固定格式,例如 「app01_userinfo」 。

2.7 表單的增刪改查

2.7.1 增

  • 單條數據:

    • 方法一 : models.表名.objects.create(字段1=值1,字段2=值2........)

    • 方法二:dict = {'字段1':值,'字段2':值.........}

      models.表名.objects.create(dict)

  • 多條數據:

    info = [
         models.UserInfo(name='root1', age=34, ut_id=1),
         models.UserInfo(name='root2', age=35, ut_id=2),
         models.UserInfo(name='root3', age=36, ut_id=1),
         models.UserInfo(name='root4', age=37, ut_id=3),
         models.UserInfo(name='root5', age=32, ut_id=1),
    ]
    models.UserInfo.objects.bulk_create(info)

2.7.2 刪

models.表名.objects.filter(知足的條件).delete()

2.7.3 改

models.表名.objects.filter(知足的條件).update(name='lll', age=23)

2.7.4 查

models.UserType.objects.all().values()   #表A的ud關聯表b

2.7.5 有子健關係的查詢正向查詢(經過A表中的ud查到表b的id)

  • 方法一:**models.A.objects.all().values('ud__id')**

  • 方法二:

    res = models.A.objects.all()
    for a in res:
        print(a.ud.id)

2.7.6 有子健關係的查詢返向查詢(經過b表中的查到a表ID)

  • 方法一:**models.B.objects.all().values('A__id')**

  • 方法二:

    res = models.B.objects.all()
    for b in res:
        print(b.a_set.id) #### 表名小寫_set

2.8 表單的增刪改查(2.0進階)

2.8.1 字段名過濾

  • filter —— 知足條件的
  • exclude —— 不知足條件

用法:

#id等於3的
models.表名.objects.filter(id=3).values()

#id不等於3的
models.表名.objects.exclude(id=3).values()

關於filter與exclude裏面填寫的參數

  • 等於: 字段名=值
  • 大於: 字段名__gt=值
  • 大於等於: 字段名__gte=值
  • 小於: 字段名__lt=值
  • 小於等於: 字段名__lte=值

2.8.2 成員(in not in)

res = models.表名.objects.filter(字段名__in=[2,4,5]) # where id in (2,4,5)
res = models.表名.objects.exclude(字段名__in=[1,2]) # where id not in (1,2)

2.8.3 區間(between...and)

# where id between 4 and 8   [4,8]
res = models.表名.objects.filter(字段名__range=[4,8])

2.8.4 模糊查詢(like)

# where name like 'a%'
res = models.表名.objects.filter(字段名__startswith="a")
res = models.表名.objects.filter(字段名__istartswith="a") #忽略大小寫

# where name like '%a'
res = models.表名.objects.filter(字段名__endswith="a")
res = models.表名.objects.filter(字段名__iendswith="a") #忽略大小寫

# where name like '%a%'
res = models.表名.objects.filter(字段名__contains="a")
res = models.表名.objects.filter(字段名__icontains="a") #忽略大小寫
只要是i開頭的基本上都是忽略大小寫

2.8.5 數據條數(count)

# select count(*) from userinfo where id>3;
# select count(id) from userinfo where id>3;
#用sql語句查詢數據條數儘可能不要查count(*)查主鍵會快不少
res = models.UserInfo.objects.filter(id__gt=3).count()

2.8.6 排序(order by)

#升序
res = models.表名.objects.order_by('字段名稱')

#降序
res = models.表名.objects.order_by('-字段名稱')

#多個條件進行排序
res = models.表名.objects.order_by('字段1','字段2') #當字段1相同是會更具字段2進行排序

2.8.7 分組(group by)| 已經(having)

# select id, sum(age) as s, username from userinfo group by username
from django.db.models import Count, Min, Max, Sum
res = models.UserInfo.objects.values("name").annotate(s=Sum('age'))

# select id, sum(age) as s, username from userinfo group by username having s > 50;
res = models.UserInfo.objects.values("name").annotate(s=Sum('age')).filter(s__gt=50)

2.8.8 分頁(limit)

# limit 1, 3 分頁
res = models.UserInfo.objects.all()[1:4]
#由於獲取對象是列表全部切片便可

2.8.9 last/first

第一條:res = models.表名.objects.first()

最後一條:res = models.表名.objects.last()

2.8.10 only|defer

只查某個字段:only('字段名稱')

除某個字段之外的全部字段:defer('字段名')

注意主鍵id無論怎麼樣都會查

2.8.11 and|or

只有and

#id等於3and名字等於a
models.表名.objects.filter(id=3,and name='a').values()

只有or

# Q
from django.db.models import Q
res = models.UserInfo.objects.filter(Q(id__gt=3) | Q(name='zekai')) #or用|連接

有and和or

# Q
from django.db.models import Q
res = models.UserInfo.objects.filter( Q(Q(id__gt=3) | Q(name='zekai')) & Q(age=23) ) #and用&連接

2.8.12 F

from django.db.models import F
models.UserInfo.objects.update(name=F('name')+1) #字段名稱都加1

2.8.13 原生(sql)| 相似(pymysql)

from django.db import connection, connections
cursor = connection.cursor()  # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()
print(row)

2.8.14 去重(distinct)

models.UserInfo.objects.values("name", 'age').distinct() #前面values有多少個就對多少個值進行去除

2.9 補充

print(res.query) #查看上述代碼生成的sql語句
相關文章
相關標籤/搜索