創(chuàng)建項目
# 創(chuàng)建項目
django-admin startproject [projectName]
# 創(chuàng)建模塊
python manage.py startapp [moduleName]
對于Mysql數(shù)據(jù)庫:需要安裝pymysql這個第三方庫
安裝命令:pip3 install mysqlclient
數(shù)據(jù)庫配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '172.0.0.1',
'PORT': 3306
}
}
模型
5.2 數(shù)據(jù)查詢
要從數(shù)據(jù)庫檢索數(shù)據(jù), 首先要獲取一個查詢集(Query Set) , 查詢集表示從數(shù)據(jù)庫獲取的對象集合,它可以有零個,一個或多個過濾器。返回查詢集的方法,稱為過濾器, 過濾器根據(jù)給定的參數(shù)縮小查詢結(jié)果范圍, 相當于sql語句中where或limit。
- 在管理器上調(diào)用過濾器方法會返回查詢集
- 查詢集經(jīng)過過濾器篩選后返回新的查詢集,因此可以寫成鏈式過濾
- 惰性執(zhí)行; 創(chuàng)建查詢集不會帶來任何數(shù)據(jù)庫的訪問,直到調(diào)用數(shù)據(jù)時,才會訪 問數(shù)據(jù)庫 。
- 以下對查詢集求值:迭代、切片、序列化、與if合用
repr() /print(/len() /list() /boo()
| 管理器的方法 | 返回類型 | 說明 |
|---|---|---|
| 模型類.objects.all() | Query Set | 返回表中所有數(shù)據(jù) |
| 模型類.objects.filter() | Query Set | 返回符合條件的數(shù)據(jù) |
| 模型類.objects.exclude() | Query Set | 返回不符合條件的數(shù)據(jù) |
| 模型類.objects.order_by() | Query Set | 對查詢結(jié)果集進行排序 |
| 模型類.objects.values() | Query Set | 返回一個Query set, 其中每個對象為一個 |
| 模型類.objects.values_list() | Query Set | 和values() 基本相同, 但每個對象是一個元 |
| 模型類.objects.reverse() | Query Set | 對排序的結(jié)果反轉(zhuǎn) |
| 模型類.objects.only(字段) | Query Set | 只顯示指定字段 |
| 類.objects.defer(字段) | Query Set | 去除指定字段 |
| 模型類.objects.get() | 模型對象 | + 返回一個滿足條件的對象; 如果沒有找到符合條件的對象,會引發(fā)模型類.Does Not Exist異常 + 如果找到多個,會引發(fā)模型 類.Multi Objects Returned異常 |
| 模型類.objects.first() | 模型對象 | 返回第一條數(shù)據(jù) |
| 模型類.objects.last() | 模型對象 | 返回最后一條數(shù)據(jù) |
| 模型類.objects.earliest () | 模型對象 | 根據(jù)指定字段返回最早增加的記錄 |
| 模型類.objects.latest(field) | 模型對象 | 根據(jù)field字段返回最近增加記錄 |
| 模型類.objects.exists() | bool | 判斷查詢的數(shù)據(jù)是否存在 |
| 模型類.objects.count() | int | 返回查詢集中對象的數(shù)目 |
- all()
# 獲取所有數(shù)據(jù)
對應(yīng)SQL:select * from User
users= User.objects.all()
- filter(**kwargs) 返回QuerySet包含與給定查找參數(shù)匹配的新查詢集。
等價于:select * from User
User.objects.filter()
對應(yīng)SQL:select * from User where username='admin'
User.objects.filter(username='admin')
對應(yīng)SQL:select * from User where id >1 and type=2
User.objects.fileter(id__gt=1, type=2)
對應(yīng)SQL:select * from User where id >1 and type = 2
User.objects.filter(id_gt=1).filter(type=2)
- exclude(**kwargs)
對應(yīng)SQL:select * from User where username != 2
User.objects.exclude(username='admin')
- order_by(*fields)
參數(shù)是字段名、可以有多個字段名,默認是升序
如果要按某個字段降序。在字段名前面加"-": "id"表示按id降序排列
按照id升序排列 對應(yīng)SQL:select * from User order by id
User.objects.order_by('id')
按照id降序排列 對應(yīng)SQL:select * from User order by id desc
User.objects.order_by('-id')
按照username升序排列 按照id降序排列 對應(yīng)SQL: select *from User order by username, id desc
User.objects.order_by('username', '-id')
- values()
返回所有字段 對應(yīng)SQL: select * from User
User.objects.values()
返回所有數(shù)據(jù)的username 和 password 字段 對應(yīng)SQL: select username, password from User
User.objects.values('username', 'password')
- reverse()
對排序的結(jié)果反轉(zhuǎn)
對應(yīng)SQL: select * from User order by id desc
User.objects.order_by('id').reverse()
對應(yīng)SQL: select * from User order by id
User.objects.order_by('-id').reverse()
- distinct() 去重
對應(yīng)SQL: select DISTINCT username from User
User.objects.values('username').distinct()
5.2.5統(tǒng)計查詢
需要先導入模塊:
from django.db.models import Max, Min, Sum, Avg, Count
- 聚合查詢:對多行查詢結(jié)果的一列進行操作
#統(tǒng)計記錄總數(shù): select count(*) from user
User.objects.aggregate(Count('uid') ) #{'uid_count':4}
User.objects.aggregate(Max('uid') ) #{'uid max':5}
User.objects.aggregate(Min('uid') ) #{'uid min':2}
- 分組統(tǒng)計
# 等價sql:
select type, count(*) from usergroup by type
res=User.objects.values('type') .annotate(Count('uid') )
# 統(tǒng)計結(jié)果:
[{"type": :' 普通用戶', 'uid count':3} ,{'type':'超級管理員', 'uid count':1} ]
# 查看生成的sql語句
print(res.query)
# 此語法忘了沒搞明白
SELECT`user`.`type`, COUNT(`user`.uid`) )AS ; `uid d count t` FROM `user` GROUP BY `user`.`type`ORDER BY NULL
5.2.6 Q對象和F對象
需要先導入模塊:
from django.db.models import Q,F
- Q對象可以對關(guān)鍵字參數(shù)進行封裝, 從而更好的應(yīng)用多個查詢, 可以組合&(and) 、I(or) 、~(not) 操作符。
#原生sql:
select * from user where uid=2 or uid= 3
User.objects.filter(Q(uid=2) | Q(uid=3) )
User.objects.filter(Q(uid gte=2) &Q(uidl te=3) )
User.objects.filter(~Q(uid gte=2) )
- F對象:用于比較表中兩個字段
#等價sql:
select * from user where uid<type
User.objects.filter(uidl te=F('type') )