目錄css
Django框架深刻應用html
咱們前期基於wsgiref、urls和views的映射關係簡單介紹了web的框架,以後初步介紹了Django的使用。python
如今咱們將真正用Django實現一個項目的功能框架,接下來,先簡單介紹一下總體的框架。mysql
開始吧!web
咱們在完成一個完整的項目以前,首先經過實現單個功能認識整個項目的框架與各個文件的做用,好比登陸功能。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項目最好用一個數據庫。
第七步 —— 表字段及數據的增刪查改
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), ]
一一對應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
STATIC_URL = '/static/' #接口訪問密碼,html導入靜態文件樣式的前綴 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), #靜態文件夾的名字 )
第一步: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作區別)
redirect(重定向)
—— 跳轉頁面render(request,'xx.html', {{'msg': ...}})
—— 傳遞數據/網址/信息等HttpResponse()
—— 返回字符串注意:Django返回的都是HttpResponse的對象,由於這裏的HttpResponse是一個類,上面三個默認繼承這個類。
第一步:Userinfo表
class Userinfo(models.Model): username = models.CharField(max_length=64, null=True) password = models.IntegerField()
注意:不建立庫,只建立表。
第二步:生成表單語句
注意一:每一次增刪查改都要來一次
注意二:第一次執行上面兩條命令時,Django會建立不少表,裏面有不少是默認的Django須要用的表。
注意二:本身寫的模型類對應的表,表名有固定格式,例如 「app01_userinfo」 。
單條數據:
方法一 : 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)
models.表名.objects.filter(知足的條件).delete()
models.表名.objects.filter(知足的條件).update(name='lll', age=23)
models.UserType.objects.all().values() #表A的ud關聯表b
方法一:**models.A.objects.all().values('ud__id')**
方法二:
res = models.A.objects.all() for a in res: print(a.ud.id)
方法一:**models.B.objects.all().values('A__id')**
方法二:
res = models.B.objects.all() for b in res: print(b.a_set.id) #### 表名小寫_set
用法:
#id等於3的 models.表名.objects.filter(id=3).values() #id不等於3的 models.表名.objects.exclude(id=3).values()
關於filter與exclude裏面填寫的參數
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)
# where id between 4 and 8 [4,8] res = models.表名.objects.filter(字段名__range=[4,8])
# 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開頭的基本上都是忽略大小寫
# 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()
#升序 res = models.表名.objects.order_by('字段名稱') #降序 res = models.表名.objects.order_by('-字段名稱') #多個條件進行排序 res = models.表名.objects.order_by('字段1','字段2') #當字段1相同是會更具字段2進行排序
# 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)
# limit 1, 3 分頁 res = models.UserInfo.objects.all()[1:4] #由於獲取對象是列表全部切片便可
第一條:res = models.表名.objects.first()
最後一條:res = models.表名.objects.last()
只查某個字段:only('字段名稱')
除某個字段之外的全部字段:defer('字段名')
注意:主鍵id無論怎麼樣都會查
只有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用&連接
from django.db.models import F models.UserInfo.objects.update(name=F('name')+1) #字段名稱都加1
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)
models.UserInfo.objects.values("name", 'age').distinct() #前面values有多少個就對多少個值進行去除
print(res.query) #查看上述代碼生成的sql語句