django 簡單項目搭建詳細過程及基本數據庫操作

介紹

Django 簡單項目構建流程

軟件架構

  1. django 2.1.5
  2. python 3.7
  3. windows 10

安裝教程

  1. cd bookManage
  2. pip install -r requirement.txt
  3. cd bookManage
  4. 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
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. 增加
  1. .save()
>>> from book.models import BookInfo,PeopleInfo
>>> book = BookInfo(
...         name='python入門',
...         pub_date='2010-1-1'
...     )
>>> book.save()
>>> book
<BookInfo: python 從入門到放棄>
  1. create()
>>> PeopleInfo.objects.create(
...         name='mgw',
...         book=book
...     )
<PeopleInfo: mgw>
2. 修改
  1. save()
>>> person = PeopleInfo.objects.get(name='mgw')
>>> person.name = 'mgw2168'
>>> person.save()
>>> person
<PeopleInfo: mgw2168>
  1. update()
>>> PeopleInfo.objects.filter(name='mgw').update(name='mgw2168')
1
3. 刪除
  1. 模型類對象.delete
>>> person = PeopleInfo.objects.get(name='mgw')
>>> person.delete()
(1, {'book.PeopleInfo': 1})
  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子句。

兩大特性
  1. 惰性查詢

創建查詢集不會訪問數據庫,直到調用數據時,纔會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用

例如,當執行如下語句時,並未進行數據庫查詢,只是創建了一個查詢集books

books = BookInfo.objects.all()

繼續執行遍歷迭代操作後,才真正的進行了數據庫的查詢

for book in books:
    print(book.name)
  1. 緩存

使用同一個查詢集,第一次使用時會發生數據庫的查詢,然後Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數。

  1. 限制查詢集

可以對查詢集進行取下標或切片操作,等同於sql中的limit和offset子句。

注意: 部支持負數索引

對查詢集進行切片後返回一個新的查詢集,不會立即執行查詢。

如果獲取一個對象,直接使用[0],等同於[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()如果沒有數據引發DoesNotExist異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章