文章目錄
介紹
Django 簡單項目構建流程
軟件架構
- django 2.1.5
- python 3.7
- windows 10
安裝教程
- cd bookManage
- pip install -r requirement.txt
- cd bookManage
- python manage.py runserver
項目構建流程
1. 創建項目
django-admin startproject bookManager
2. 創建應用
python manager.py startapp book
3. 配置解釋器
# 進入指定虛擬環境
which python3(which python)
# python3
/home/python/.virtualenvs/py3_django/bin/python3
# python2
/home/python/.virtualenvs/py_django/bin/python
4. 安裝應用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#添加子應用
'book.apps.BookConfig'
]
5. 本地化
#設置中文
LANGUAGE_CODE = 'zh-Hans'
#亞洲上海時區
TIME_ZONE = 'Asia/Shanghai'
6.模板路徑
在應用同級目錄下,創建 templates 模板文件夾
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
7. 項目中匹配urls
正則 : 路徑只要不是admin/就算匹配成功。幷包含到應用中的urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path(r'book/', include('book.urls')),
]
8. 應用中匹配urls.py
- 應用中創建urls.py
- 正則 : 路徑中包含booklist/,就調用視圖中對應的bookList函數
from django.urls import path
from . import views
urlpatterns = [
# 匹配書籍列表信息的URL,調用對應的bookList視圖
path(r'booklist/',views.bookList)
]
9.準備視圖
# 定義視圖:提供書籍列表信息
def bookList(request):
return HttpResponse('Hello world!')
10. 開啓服務器, 測試項目
# 進入項目文件中, 開啓項目對應的服務器
python manage.py runserver
# 瀏覽器中輸入網址
http://127.0.0.1:8000/book/booklist/
11. 數據庫配置
在 settings 中配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫引擎
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'book', # 數據庫名
'USER': 'xxx', # 用戶名
'PASSWORD': 'xxx', # 密碼
'HOST': 'localhost', # 主機
'PORT': '3306', # 端口
}
}
12. 創建模型類
在book/models.py中,創建BookInfo和PeopleInfo模型類:
# 準備書籍列表信息的模型類
class BookInfo(models.Model):
# 創建字段,字段類型...
name = models.CharField(max_length=20, verbose_name='名稱')
pub_date = models.DateField(verbose_name='發佈日期', null=True)
readcount = models.IntegerField(default=0, verbose_name='閱讀量')
commentcount = models.IntegerField(default=0, verbose_name='評論量')
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'bookinfo' # 指明數據庫表名
verbose_name = '圖書' # 在admin站點中顯示的名稱
def __str__(self):
"""定義每個數據對象的顯示信息"""
return self.name
# 準備人物列表信息的模型類
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
name = models.CharField(max_length=20, verbose_name='名稱')
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
def __str__(self):
return self.name
13. 遷移數據庫
python manage.py makemigrations
python manage.py migrate
完成後連接mysql, 查看數據庫是否創建成功
mysql -u USERNAME -p
PASSWORD
注:
USERNAME 是用戶名
PASSWORD 是密碼
我們將此類添加到工程settings.py中的INSTALLED_APPS列表中,表明註冊安裝具備此配置屬性的應用。
-
AppConfig.name屬性表示這個配置類是加載到哪個應用的,每個配置類必須包含此屬性,默認自動生成。
-
AppConfig.verbose_name屬性用於設置該應用的直觀可讀的名字,此名字在Django提供的Admin管理站點中會顯示,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'book'
verbose_name = '圖書管理'
數據庫操作
1. 增加
- .save()
>>> from book.models import BookInfo,PeopleInfo
>>> book = BookInfo(
... name='python入門',
... pub_date='2010-1-1'
... )
>>> book.save()
>>> book
<BookInfo: python 從入門到放棄>
- create()
>>> PeopleInfo.objects.create(
... name='mgw',
... book=book
... )
<PeopleInfo: mgw>
2. 修改
- save()
>>> person = PeopleInfo.objects.get(name='mgw')
>>> person.name = 'mgw2168'
>>> person.save()
>>> person
<PeopleInfo: mgw2168>
- update()
>>> PeopleInfo.objects.filter(name='mgw').update(name='mgw2168')
1
3. 刪除
- 模型類對象.delete
>>> person = PeopleInfo.objects.get(name='mgw')
>>> person.delete()
(1, {'book.PeopleInfo': 1})
- 模型類.objects.filter().delete()
>>> BookInfo.objects.filter(name='python 從入門到放棄').delete()
(1, {'book.BookInfo': 1, 'book.PeopleInfo': 0})
查詢
1. 基本查詢
get 查詢單一結果, 若不存在, 會拋出
模型類.DoesNotExist
異常
all 查詢鎖哥結果
count 查詢結果數量
2. 過濾查詢
filter 過濾符合條件的多個結果
exclude 排除掉符合條件剩下的結果
get 過濾單一結果
# 過濾查詢表達式
屬性名稱__比較運算符=值
1)相等
exact:表示判等。
例:查詢編號爲1的圖書
BookInfo.objects.filter(id__exact=1)
等價於
BookInfo.objects.filter(id=1)
2)模糊查詢
contains:是否包含。
說明:如果要包含%無需轉義,直接寫即可。
例:查詢書名包含’傳’的圖書。
BookInfo.objects.filter(name__contains='傳')
<QuerySet [<BookInfo: 射鵰英雄傳>]>
startswith,endswith:以指定值開頭或結尾。
以上運算符都區分大小寫,在這些運算符前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith.
3) 空查詢
isnull:是否爲null。
4) 範圍查詢
in:是否包含在範圍內。
5)比較查詢
gt大於 (greater then)
gte大於等於 (greater then equal)
lt小於 (less then)
lte小於等於 (less then equal)
不等於的運算符,使用exclude()過濾器。
6)日期查詢
year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。
F和Q對象
F對象
之前的查詢都是對象的屬性與常量值比較,兩個屬性怎麼比較呢? 答:使用F對象,被定義在django.db.models中。
語法: F(屬性名)
例:查詢閱讀量大於等於評論量的圖書。
>>> from django.db.models import F
>>> BookInfo.objects.filter(readcount__gt=F('commentcount'))
<QuerySet [<BookInfo: 雪山飛狐>]>
可以在F對象上使用算數運算。
>>> BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
<QuerySet [<BookInfo: 雪山飛狐>]>
Q對象
多個過濾器逐個調用表示邏輯與關係,同sql語句中where部分的and關鍵字。
例:查詢閱讀量大於20,並且編號小於3的圖書。
>>> BookInfo.objects.filter(readcount__gt=20,id__lt=3)
<QuerySet [<BookInfo: 天龍八部>]>
或者
>>> BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
<QuerySet [<BookInfo: 天龍八部>]>
如果需要實現邏輯或or的查詢,需要使用Q()對象結合|運算符,Q對象被義在django.db.models中。
語法:Q(屬性名__運算符=值)
例:查詢閱讀量大於20的圖書,改寫爲Q對象如下。
BookInfo.objects.filter(Q(readcount__gt=20))
Q對象可以使用&、|連接,&表示邏輯與,|表示邏輯或。
例:查詢閱讀量大於20,或編號小於3的圖書,只能使用Q對象實現
>>> BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>
Q對象前可以使用~操作符,表示非not。
例:查詢編號不等於3的圖書。
>>> BookInfo.objects.filter(~Q(id=3))
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>
聚合函數和排序函數
聚合函數
使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg平均,Count數量,Max最大,Min最小,Sum求和,被定義在django.db.models中。
例:查詢圖書的總閱讀量。
>>> from django.db.models import Sum
>>> BookInfo.objects.aggregate(Sum('readcount'))
{'readcount__sum': 126}
注意aggregate的返回值是一個字典類型,格式如下:
{'屬性名__聚合類小寫':值}
如:{'readcount__sum': 126}
使用count時一般不使用aggregate()過濾器。
例:查詢圖書總數。
BookInfo.objects.count()
注意count函數的返回值是一個數字。
排序
使用order_by對結果進行排序
查詢集
- all():返回所有數據。
- filter():返回滿足條件的數據。
- exclude():返回滿足條件之外的數據。
- order_by():對結果進行排序。
- exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False。
從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。
兩大特性
- 惰性查詢
創建查詢集不會訪問數據庫,直到調用數據時,纔會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用
例如,當執行如下語句時,並未進行數據庫查詢,只是創建了一個查詢集books
books = BookInfo.objects.all()
繼續執行遍歷迭代操作後,才真正的進行了數據庫的查詢
for book in books:
print(book.name)
- 緩存
使用同一個查詢集,第一次使用時會發生數據庫的查詢,然後Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數。
- 限制查詢集
可以對查詢集進行取下標或切片操作,等同於sql中的limit和offset子句。
注意: 部支持負數索引
對查詢集進行切片後返回一個新的查詢集,不會立即執行查詢。
如果獲取一個對象,直接使用[0],等同於[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()如果沒有數據引發DoesNotExist異常。