Django打造大型企業官網

第1章 Django預熱

  • 1-爲何須要虛擬環境

  • 2-virtualenv建立虛擬環境

  • 3-virtualenvwrapper使用

  • 4-URL組成部分講解

  • 5-課程準備工做

  • 6-Django介紹

第2章 Django URL

  • 7-第一個Django項目剖析(1)

  • 8-第一個Django項目剖析(2)

  • 9-Django的項目規範

  • 10-DEBUG模式詳解

  • 11-視圖函數介紹

  • 12-URL映射補充

  • 13-URL中傳遞參數給視圖函數

  • 14-Django內置的URL轉換器

  • 15-urls分層模塊化

  • 16-url命名與反轉url

  • 17-應用命名空間和實例命名空間

  • 18-include函數詳解

  • 19-re_path函數詳解

  • 20-reverse函數補充

  • 21-自定義path轉換器

  • 22-URL映射時指定默認參數

第3章 Django模板

  • 24-模板查找路徑配置

  • 25-模板變量使用詳解

  • 26-if標籤使用詳解

  • 27-for標籤使用詳解

  • 28-with標籤使用詳解

  • 29-url標籤使用詳解

  • 30-autoescape標籤使用詳解

  • 31-verbatim標籤使用詳解

  • 32-DTL經常使用過濾器(1)

  • 33-DTL經常使用過濾器(2)

  • 34-DTL經常使用過濾器(3)

  • 35-DTL經常使用過濾器(4)

  • 36-DTL經常使用過濾器(5)

  • 37-自定義過濾器步驟詳解

  • 38-自定義過濾器實戰

  • 39-模板結構優化之include標籤詳解

  • 40-模板結構優化之繼承詳解

  • 41-模板中加載靜態文件詳解

第4章 Django數據庫

  • 42-數據庫操做相關軟件和包介紹

  • 43-Django使用原生SQL語句操做數據庫

  • 44-圖書管理系統案例(1)

  • 45-圖書管理系統案例(2)

  • 46-ORM模型介紹

  • 47-建立和映射ORM模型 

  • 48-ORM模型的基本增刪改查操做

  • 49-ORM經常使用Field詳解(1)

  • 50-navie時間和aware時間詳解

  • 51-ORM經常使用Field詳解(2)

  • 52-ORM經常使用Field詳解(3)

  • 53-Field經常使用參數詳解

  • 54-Meta類中常見配置

  • 55-ORM外鍵使用詳解

  • 56-ORM外鍵刪除操做

  • 57-表關係之一對多

  • 58-表關係之一對一

  • 59-表關係之多對多

  • 60-ORM查詢條件詳解-準備工做

  • 61-PyCharm鏈接數據庫

  • 62-ORM查詢條件詳解-exact和iexact

  • 63-ORM查詢條件詳解-contains和icontains

  • 64-ORM查詢條件詳解-in和關聯模型查詢

  • 65-ORM查詢條件詳解-gt、gte、it和ite

  • 66-ORM查詢條件詳解-startswith和endswith

  • 67-ORM查詢條件詳解-range

  • 68-ORM查詢條件詳解-date、time、year、week_day等

  • 69-ORM查詢條件詳解-isnull和regex

  • 70-ORM聚合函數詳解-準備工做

  • 71-ORM聚合函數詳解-Avg

  • 72-ORM聚合函數詳解-aggregate和annotate

  • 73-ORM聚合函數詳解-Count

  • 74-ORM聚合函數詳解-Max和Min

  • 75-ORM聚合函數詳解-Sum

  • 76-F表達式詳解

  • 77-Q表達式詳解

  • 78-objects對象所屬類原理剖析

  • 79-QuerySet API詳解-filter、exclude、annotate

  • 80-QuerySet API詳解-order_by

  • 81-QuerySet API詳解-values和values_list

  • 82-QuerySet API詳解-all方法

  • 83-QuerySet API詳解-select_related

  • 84-QuerySet API詳解-prefetch_related

  • 85-QuerySet API詳解-defer和only

  • 86-QuerySet API詳解-get方法

  • 87-QuerySet API詳解-create方法

  • 88-QuerySet API詳解-get_or_create和bulk_create

  • 89-QuerySet API詳解-count和exists

  • 90-QuerySet API詳解-distinct

  • 91-QuerySet API詳解-update和delete

  • 92-QuerySet API詳解-切片操做

  • 93-QuerySet API詳解-QuerySet轉換爲SQL的條件

  • 94-ORM做業講解-準備工做

  • 95-ORM做業詳解(1)

  • 96-ORM做業詳解(2)

  • 97-ORM做業詳解(3)

  • 98-ORM遷移詳解-migrations命令補充

  • 99-ORM遷移詳解-migrate命令報錯解決方案

  • 100-根據已有的表生成ORM模型詳解

  • 101-Django數據庫練習題

1-爲何須要虛擬環境

1.1 隔離多套開發環境,好比Django1.10.1和Django2.0.1;

1.2 virtaulenv工具的使用;

1.3 不一樣項目依賴的第三方包是不一樣的,虛擬環境能夠解決該狀況;

2-virtualenv建立虛擬環境

2.1 安裝virtualenv工具;

  • pip3 install virtualenv(Python3.x)
  • pip install virtualenv  (Python2.x)

2.2 建立虛擬環境;

  • virtualenv 虛擬環境的名稱;

2.3 進入退出虛擬環境;

  • activate;
  • deactivate;

2.4 *nix進入虛擬環境;

  • source /path/to/virtualenv/bin/activate進入虛擬環境;

2.5 建立虛擬環境時候指定Python解釋器版本;

  • virtualenv -p python解釋器的路徑;

3-virtualenvwrapper使用(用來管理virtualenv)

3.1 virtualenvwrapper的安裝;

  • *nix:pip install virtualenvwrapper(自動將virtualenv安裝好)
  • windows:pip install virtualenvwrapper-win

2.2 建立虛擬環境

  • mkvirtualenv 虛擬環境的名稱;

2.3 進入虛擬環境;

  • workon 虛擬環境名稱;

2.4 其餘操做;

  • 退出虛擬環境deactivate;
  • 列出虛擬環境lsvirtualenv;
  • 刪除虛擬環境rmvirtualenv;
  • 進入到虛擬環境所在目錄cdvirtualenv;
  • 修改虛擬環境目錄;

4-URL組成部分講解

4.1 URL-Uniform Resource Locator,統一資源定位符;

  • scheme:協議;好比http,https;
  • host:主機名、域名;
  • port:端口號;
  • path:資源路徑;
  • query-string:查詢字符串,以鍵值對形式存在;
  • anchor:錨點,前端工程師用來作定位;

5-課程準備工做

5.1 已經安裝了Python3.6及其以上的版本;

5.2 安裝virtualenwrapper工具;

5.3 pip install django==2.0;

5.4 安裝Pycharm 全宇宙最專業的Python IDE開發工具——(Professional版本和Community版本)比較耗費PC性能;

5.5 安裝最新版本MySQL5.7.21;

5.6 安裝pymysql驅動:pip install pymysql,是用Python來操做MySQL的中間件;

5.7 進入到虛擬環境後再進行安裝;

6-Django介紹

6.1 Django歷史及介紹;

6.2 快速開發;

6.3 大而全,Python web 開發的首選框架;

6.4 國內不少商業網站使用Django框架作支撐,因此不用擔憂Django框架的性能問題;

科技文章閱讀:前端

Python + Django 如何支撐了 7 億月活用戶的 Instagram?

6.4. 各類服務器講解;

  • Web服務器:Apache、Nginx、IIS;
  • 應用服務器:uwsgi、Tomcat;
  • Web應用框架:Django、Flask、Java中的SSH(Structs2+Spring3+Hibernate3)框架都是典型的Web應用框架;

7-第一個Django項目剖析(1)

7.1 建立Django項目

  • pip3 install django==2.0.2;
  • django-admin startproject  項目名稱;
  • 建立應用:python manage.py startapp 應用名稱;
  • 使用Pycharm IDE工具進行建立

7.2 運行項目;

  • python manage.py runserver (可指定端口號);

7.3 Pycharm中設置」單一實例「,避免一個項目運行屢次;

 

8-第一個Django項目剖析(2)

8.1 Pycharm中修改Django項目的端口號、IP; 

8.2 settings.py中設置ALLOWED_HOSTS = ['*'];

8.3 在Python manage.py runserser後添加IP和端口,如python manage.py runserver 0.0.0.0:8000

8.4 檢查本身電腦的防火牆是否關閉;

8.5 python manage.py help

settings.py;

"""
Django settings for DjangoURL project.

Generated by 'django-admin startproject' using Django 2.1.3.

For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '77g^#&!t_o%%5u8(3^6%(%y&37kazp4@77ij@th^o#qz0k6ye)'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'DjangoURL.urls'

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',
            ],
        },
    },
]

WSGI_APPLICATION = 'DjangoURL.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'

manage.py;

urls.py;

wsgi.py;

9-Django的項目規範

9.1 視圖函數初識;

9.2 什麼是動態頁面?是否與數據庫有交互,即數據從數據庫中查詢所得;

9.3 Django中的models.py forms.py ;

9.4 Django快速建立app的命令:Python mange.py startapp 應用名稱,便可建立app;

9.5 Django和Flask的區別:海軍和海盜的區別,國軍和八路的區別,正規軍與土八路的區別;

9.6 建立項目與建立app的區別:django-admin與python manage.py;把全部的代碼寫在Django的app中;

10-DEBUG模式詳解

10.1 若是設置了DEBUG = True,修改了代碼後,按下Ctrl+S,就能夠自動重啓服務,便於調試代碼;
10.2 設置了DUBUG=True模式後,會打印錯誤信息之瀏覽器中;
10.3 若是項目是要部署到生產環境中,必定要關閉DEBUG模式,即DEBUG=False;避免出現很大的安全隱患;
10.4 若是將DEBUG模式設置爲False後,ALLOWED_HOST中必須設置IP地址,且IP地址爲字符串形式;

11-視圖函數介紹

11.1 視圖通常都寫在app的views.py中;

11.2 視圖函數的第一參數永遠是request;

11.3 視圖函數的返回結果必須是HttpResponse對象或者其子類;

12-URL映射補充

12.1 爲何會去urls.py文件中尋找映射呢?

12.2 在urls.py中,全部的映射都應該放到urlpatters列表中;

13-URL中傳遞參數給視圖函數

13.1 在url中使用變量的方式,在path的第一個參數中,使用’<參數名>‘的方式,能夠傳遞參數;

13.2 在視圖函數中也要寫一個參數,視圖函數中的參數必須和url中的參數名稱保持一致,不然沒法找到該參數,另外,url中能夠傳遞多個參數;

13.3 採用」查詢字符串「的方式,在url中,不須要單獨的匹配查詢字符串的部分,只須要在視圖函數中使用request.GET.get('參數名稱')的方式來獲取,示例代碼以下:

13.4 由於查詢字符串使用的GET請求,因此咱們經過request.GET來獲取參數,由於GET是一個相似於字典的數據類型,因此獲取值的方式與字典是一致的;

from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.

def book(request):
    return HttpResponse("圖書首頁")


def book_detail(request, book_id, category_id):
    text = "您獲取的圖書的id是:%s,圖書分類爲:%s" % (book_id, category_id)
    return HttpResponse(text)


def auth_detail(request):
    author_id = request.GET.get('id')
    text = '做者的id是:%s' % author_id
    return HttpResponse(text)

14-Django內置的URL轉換器

14.1 若是不在urls中指定轉換器,默認是str類型;

14.2 UUID全宇宙的值;

14.3 url參數轉換器:

  • str:除了斜槓」/「之外全部的字符都是能夠的;
  • int:只有一個或多個阿拉伯數字;
  • path:全部的字符都是知足的;
  • uuid:只有知足」uuid.uuid4()「這個函數的返回值類型的字符串的格式;
  • slug:英文中的橫槓或者英文字符或者阿拉伯數字或者下劃線;

15-urls分層模塊化

15.1 什麼叫作url模塊化呢?

在app中定義urls.py文件並在urls.py中進行include引入;python

若是項目變得愈來愈大,那麼url會變得愈來愈多,若是都放在主要的’urls.py‘文件中,那麼後續將不太好管理,所以咱們能夠將每個app本身url放到本身的app/urls.py文件中進行管理;mysql

通常咱們都會在每一個app下新創建一個叫作urls.py的文件,用來存儲本身的」子url「;web

15.2 應該使用’include‘函數包含子urls.py,而且這個urls.py的路徑是相對於項目的路徑的,示例代碼以下:

app/urls.py文件內容以下:正則表達式

from django.urls import path
from book import views

urlpatterns = [
    path('', views.book),
    path('detail/<book_id>/<category_id>/', views.book_detail),
    path('author/', views.auth_detail),
    path('publisher/<int:publisher_id>/', views.publisher_detail),
    path('book_list/', views.book_list),
]

主要的urls.py文件內容以下:sql

from django.contrib import admin
from django.urls import path
from django.urls import include

from django.http import HttpResponse
from django.urls import converters
from book import views


def index(request):
    return HttpResponse("豆瓣網首頁")

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('book/', include('book.urls'))
]

15.3 在app的urls.py中,全部的url匹配也要放在一個叫作’urlpatterns‘的列表中,不然沒法查找;

15.4 url是會根據主’urls.py‘和app中的urls.py進行拼接的,所以注意避免多加斜槓!

16-url命名與反轉url

16.1 爲何給url取名?

由於url是常常發生變化的,若是在代碼中寫死,可能會常常全局改動代碼,給url取個名字,之後使用url時候,就使用他的名字進行reverse反轉便可,就不須要寫死url了,好處多多哦!數據庫

16.2 爲何須要命名空間呢?

在多個app之間,有可能產生同名的url,這種機率在開發過程當中仍是極高的,這個時候爲了不反轉url的時候產生混淆,可使用」應用命名空間「來作區分,定義應用命名空間很是簡單,只要在app的urls.py中添加一個變量名:app_name便可,用來指定這個app的命名空間,示例代碼以下所示:django

PS:之後在作反轉的時候,可使用以下格式:」應用命名空間:url名稱「的方式進行反轉;、flask

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Project: DjangoURL 
# Software: PyCharm2018.3
# DateTime: 2018-11-12 21:29
# File: urls.py
# __author__: 天晴天朗
# Email: tqtl@tqtl.org


from django.urls import path
from front import views

# 定義應用命名空間
app_name = 'front'

urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login, name='login'),
]

17-應用命名空間和實例命名空間

17.1 一個app能夠建立多個實例,可使用多個url映射同一個app,因此就會產生一個問題,之後在作反轉的時候,若是使用應用命名空間,那麼就會發生混淆,爲了不這個問題,咱們可使用實例命名空間,實例命名空間也是很是簡單的,只要在include中,傳遞一個namespace變量便可,實例代碼以下:

from django.contrib import admin
from django.urls import path
from django.urls import include

from django.http import HttpResponse

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/', include('book.urls')),
    path('front/', include('front.urls')),
    path('cms/', include('cms.urls')),
    path('cms1/', include('cms.urls',namespace='cms1')),
    path('cms2/', include('cms.urls',namespace='cms2')),
]

之後在作反轉的時候,就能夠根據實例命令空間來指定具體的url,實例代碼以下:windows

from django.shortcuts import render
from django.http import HttpResponse


# Create your views here.


def index(request):
    username = request.GET.get('username')
    if username:
        return HttpResponse("CMS的首頁")
    else:
        current_namespace = request.resolver_match.namespace
        return HttpResponse(reversed("%s:login" % current_namespace))


def login(request):
    return HttpResponse("CMS登陸的首頁")

18-include函數詳解(三種用法)

18.1 include(module,namespace = None)

  • module:子url的模塊字符串
  • namespace:實例命名空間,這個地方須要注意一點,若是沒有指定實例命名空間,那麼前提必需要先指定應用命名空間,也就是在子urls.py中添加app_name變量;

18.2 include(pattern_list,app_namespace),namespace=None),include函數的第一個參數既能夠是一個字符串,也能夠是一個元組,若是是元組,那麼元組的第一個參數是子urls.py模塊的字符串,元組的第二個參數是應用命名空間,也就是說,應用命名空間既能夠在子urls.py中指定也能夠在include函數中指定;

18.3 include(pattern_list),其中pattern_list是一個列表,這個列表中的path或者re_path的實例代碼以下:

urlpatterns = [
path('movie/',include([
  path('',views.movie),
  path('list/',views.movie_list),
]
)) ]

19-re_path函數詳解

19.1 爲何要使用re_path,re_path是包含正則表達式的path;

19.2 re_path的使用注意事項;

  • re_path和path的本質是同樣的,只不過多了正則表達式的功能;
  • r'^$',以r開頭,表示原生字符串,寫正則表達式,推薦使用原生字符串,raw單詞的縮寫;
  • 在re_path中定義變量,格式(?P<變量名稱>),詳情以下:
  • path可知足大多數使用需求,特殊場景纔會用到re_path,好比article/2018/12/19
  • 主urls中,注意結尾添加斜槓/;
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Project: DjangoURL 
# Software: PyCharm2018.3
# DateTime: 2018-11-16 14:06
# File: urls.py
# __author__: 天晴天朗
# Email: tqtl@tqtl.org
from django.urls import re_path
from article import views

urlpatterns = [
    re_path(r'^$', views.article),
    re_path(r'^list/(?P<year>\d{4})/$', views.article_list),
]

20-reverse函數補充 

20.1 若是在反轉url中須要使用到參數,可在reverse參數中添加kwargs={'key':value}(keywords+arguments的拼接縮寫);

20.2 若是想要添加查詢字符串好比?name = cuixiaozhao,須要手工進行拼接;

實例代碼以下:

views.py;

from django.shortcuts import render
from django.shortcuts import redirect
from django.shortcuts import reverse
from django.http import HttpResponse


# Create your views here.
def index(request):
    """
    訂單
    :param request:
    :return:
    """
    return HttpResponse("訂單首頁")


def login(request):
    username = request.GET.get('username')
    if username:
        return HttpResponse('登陸頁面')
    else:
        # login_url = reverse('login')
        detail_url = reverse('order_detail', kwargs={'order_id': 1})
        return redirect(detail_url)


def order_detail(request, order_id):
    """
    訂單詳情
    :param request:
    :param order_id:
    :return:
    """
    text = "您的訂單號是:%s" % order_id
    return HttpResponse(text)

21-自定義path轉換器

21.1 自定義path轉換器7大步;

  • 定義一個類,繼承至object;Python2分爲經典類和新式類,Python統一爲新式類;
  • 在類中定義一個屬性,regex=‘xxx’,該屬性用來限制url中轉換器的正則表達式;
  • 實現to_pathon(self,value);
  • 實現to_url(self,value);
  • 將定義好的converter註冊到django中,register_converters(自定義的轉換器的類名稱);
  • 將全部的代碼寫到一個獨立的converters.py文件中;
  • 在項目的包的__init__.py文件中,進行converters的導入,即執行該文件中的代碼,那麼轉換器將可使用!

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Project: DjangoURL 
# Software: PyCharm2018.3
# DateTime: 2018-11-16 15:31
# File: converters.py
# __author__: 天晴天朗
# Email: tqtl@tqtl.org


from django.urls import register_converter


class CategoryConverter(object):
    """
    自定義urls轉換器:cate;
    """
    # 正則規則必須爲regex名稱;
    regex = 'r\w+|(\w+\+\w+)+'

    def to_python(self, value):
        """
        value:python + django + flask
        ['python','django','flask']
        :param value:
        :return:
        """
        result = value.split('+')
        return result

    def to_url(self, value):
        """
        value:['python','django','flask']
        python + django + flask
        :param value:
        :return:
        """
        if isinstance(value, list):
            result = "+".join(value)
            return result
        else:
            raise RuntimeError('轉換URL的時候,分類參數必須爲列表形式!')


register_converter(CategoryConverter, 'cate')

 

22-URL映射時指定默認參數

 23-模板介紹

24-模板查找路徑配置

24.1 首先在DIRS中配置的templates目錄中查找;

24.2 其次在自身的app下的templates目錄中查找;

24.3 最後會在其餘app下的templates目錄中查找;

25-模板變量使用詳解

25.1 在模板中使用變量,須要將變量名放置到兩個花括號中;

25.2 若是要訪問對象的屬性,須要使用」對象.屬性名「的方式訪問;

25.3 列表也是使用「點」的方式訪問,而不是Python中的person[0]的方式;

25.4 由於在訪問字典對象的時候也是經過person.keys的形式訪問,因此不建議使用keys、items、values做爲字典的鍵值存在;

26-if標籤使用詳解

26.1 全部的標籤都是在「花括號百分號」中;

26.2 if有閉合標籤endif;

26.3 if的語法和判斷運算符(>=,<=,==以及in not in is not is等)和python中的是一致的;

27-for標籤使用詳解

27.1 for標籤的總結:

  • for中不像Python中的那樣,不會有break continue
  • for in endfor
  • for in empty endfor

28-with標籤使用詳解

28.1 在模板中想要定義變量,只能使用with語句進行定義;

28.2 使用with定義的變量,只能在該做用域中進行使用!

29-url標籤使用詳解

30-autoescape標籤使用詳解

31-verbatim標籤使用詳解

32-DTL經常使用過濾器(1)

33-DTL經常使用過濾器(2)

34-DTL經常使用過濾器(3)

35-DTL經常使用過濾器(4)

36-DTL經常使用過濾器(5)

37-自定義過濾器步驟詳解

37.1 在app中建立包-templatetags,必須爲這個名字;

  • my_filter.py
  • 定義過濾器函數,第一個參數永遠爲被過濾的值,最多有兩個參數
  • 定義完成過濾器後要進行註冊
  • 在DTL模板文件中使用load 加載過濾器的名稱,進行引用前的加載工做;

38-自定義過濾器實戰

38.1 可經過裝飾器方式進行自定義過濾器的註冊,亦可指定過濾器的名稱;

39-模板結構優化之include標籤詳解

40-模板結構優化之繼承詳解

40.1 extends必須放在第一行;

41-模板中加載靜態文件詳解

 章節 4 Django數據庫

42-數據庫操做相關軟件和包介紹

  • mysql-python(僅支持Python2.x)
  • mysql-client(基於mysql-python,支持Python3.x)
  • pymysql(純Python實現的驅動,性能不如以上)
  • MySQL(connector,C++鏈接器)

 

43-Django使用原生SQL語句操做數據庫

# 修改數據庫鏈接爲MySQL數據庫;
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DataGather',
        'USER': 'root',
        'PASSWORD': 'Tqtl911!@#)^',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

44-圖書管理系統案例(1)

45-圖書管理系統案例(2)

46-ORM模型介紹

46.1 SQL語句重複利用率不高;

46.2 不少SQL

46.3 SQL注入問題;

ORM-對象關係映射,經過類的方式操做數據庫;

ORM模型的好處:

  • 易用性;
  • 性能損耗小,綜合考慮下,有點大於缺點;
  • 設計靈活;
  • 可移植性;

47-建立和映射ORM模型

47.1 若是不在models.py中指定表名,就會默認生成app名_類名的表名;

 

from django.db import models


# Create your models here.
class Book(models.Model):
    """書籍"""
    id = models.AutoField(primary_key=True)  # 表明是一個主鍵;
    name = models.CharField(max_length=100, null=False, verbose_name='書籍名稱')
    author = models.CharField(max_length=100, null=False, verbose_name='書籍做者')
    price = models.FloatField(null=False, default=0, verbose_name="書籍價格")


class Publisher(models.Model):
    """出版社"""
    name = models.CharField(max_length=100, null=False)
    address = models.CharField(max_length=100, null=True)

 

48-ORM模型的基本增刪改查操做

48.1 基本的增刪改查操做:

  • 增長數據:實例化對象,而後save至數據庫中;
  • 刪除數據:根據主鍵或者其餘方式,查詢出來後,進行delete操做
  • 修改數據:先查詢到數據,而後進行從新賦值操做,最後save至數據庫中;
  • 查詢數據:根據get或者filter方法,進行數據查詢,可使用first方法進行第一條數據的展現;
from django.shortcuts import render
from django.shortcuts import HttpResponse
from .models import Book


# Create your views here.

def index(request):
    # 一、使用ORM添加一條數據到數據庫中;
    book = Book(name='西遊記', author='吳承恩', price='66')
    book.save()

    # 二、進行書籍的查詢;get和filter方法以及first方法;
    book1 = Book.objects.get(pk=2)  # 無論主鍵是id仍是nid,均可以;
    book2 = Book.objects.filter(name='西遊記')  # <QuerySet [<Book: <Book:(西遊記,吳承恩,66.0)>>]>
    book2 = Book.objects.filter(name='西遊記').first()  # <Book:(西遊記,吳承恩,66.0)>
    print(book2)
    print(book1)

    # 三、刪除數據-delete方法;
    book3 = Book.objects.get(pk=5)
    book3.delete()

    # 四、修改數據:先查詢出來,再從新賦值,最後save至數據庫;
    book4 = Book.objects.get(pk=6)
    book4.price = 1993
    book4.save()# 注意不要忘記save方法;
    return HttpResponse('書籍查詢成功!')

49-ORM經常使用Field詳解(1)

49.1 一些常見的Field;

  • BigAutoField
  • BooleanField
  • CharField和TextField,前者存儲254字符,後者能夠很大,酌情使用!

50-navie時間和aware時間詳解

  • pytz 庫是專門用來處理時區問題;默認安裝Django的時候會自動安裝上,也能夠經過pip install pytz進行安裝;
  • navie時間,不知道本身的時間表示的是哪一個時區的;
  • aware表示知道本身是哪一個時區的;
Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Django 2.1.3
import pytz
from datetime import datetime
now = datetime.now()
now
datetime.datetime(2018, 11, 29, 16, 33, 41, 110258)
utc_timezone = pytz.timezone("UTC")
now.astimezone(utc_timezone)
datetime.datetime(2018, 11, 29, 8, 33, 41, 110258, tzinfo=<UTC>)
now = now.re
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'datetime.datetime' object has no attribute 're'
now = now.replace(day=22)
now
datetime.datetime(2018, 11, 22, 16, 33, 41, 110258)
now = now.replace(tzinfo=pytz.timezon)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: module 'pytz' has no attribute 'timezon'
now = now.replace(tzinfo=pytz.timezon('Asia/Shanghai'))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: module 'pytz' has no attribute 'timezon'
now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai'))
now
datetime.datetime(2018, 11, 22, 16, 33, 41, 110258, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)

若是USE_TZ設置爲False,那麼Django獲取到的當前時間

51-ORM經常使用Field詳解(2)

51.1 Django中的三種時間類型;

  • DateField
  • TimeField
  • DateTimeField

52-ORM經常使用Field詳解(3)

52.1 其餘的Field

  • EmailField,不會驗證是否符合郵箱地址規則,本質是字符串,在ModelForm中會用到;
  • FileField;
  • FloatField;
  • IntegerField;
  • SmallIntegerField;
  • TextField;
  • URLField;

53-Field經常使用參數詳解

  • null=True;
  • blank=True;
  • db_column = 「映射到數據庫中的名稱」;
  • default = 0;
  • default = now;
  • primary_key = True;
  • unique =True,null = True;
  • choices = 變量名;

54-Meta類中常見配置

54.1 定義models的時候,Meta的常見配置;

  •  db_table = 「表名」
  • ordering = [「字段名」],最排序使用;能夠添加負號,以升降序排序;

定義def __str__(self):定義方法,return "<(Author id:%s,create_time:%s)>"%(self.id,self.create_time),能夠在視圖函數中打印具體對象;

  • verbose_name = ""
  • verbose_name_plural= verbose_name

55-ORM外鍵使用詳解

55.1 外鍵初識;

 

  • 跨app使用ForeignKey,須要制定app名稱.model名稱
  • self表明自身;

 

56-ORM外鍵刪除操做

56.1 on_delete= models.CASCADE級聯操做;on_delete=

56.2 on_delelte = models.PROTECT;

56.3 on_delete = models.SET_NULL;可是字段自己爲null;

56.4 on_delete = models,SET_DEFAULT;被刪除後,指定默認值;

56.5 on_delete = models.SET(此處能夠指定一個函數),null=True)

56.6 DO_NOTHING,不採起任何行動,一切全看數據庫級別的約束;

on_delete = models.SET_DEFAULT,null =True,default = Category.objects.get(pk=4))

根據實際的業務進行指定以上兩種類型;

57-表關係之一對多

58-表關係之一對一

59-表關係之多對多

60-ORM查詢條件詳解-準備工做

61-PyCharm鏈接數據庫

驅動下載地址: https://dev.mysql.com/downloads/connector/j/ 

62-ORM查詢條件詳解-exact和iexact

62.1 collation排序規則-大小寫敏感與不敏感(utf8_bin與)

62.2 exact(至關於==)與iexact(ignore exact至關於like);

from django.shortcuts import render

from django.http import HttpResponse

# from .models import Article
from .models import *


# Create your views here.


def index(request):
    # 一、id =1和 id__exact =1 二者等價;
    # article = Article.objects.filter(id__exact=1)# 二者等價!
    # article = Article.objects.filter(id=1) # 二者等價!

    # 二、 區分大小寫和不區分大小寫!涉及到MySQL數據庫的排序規則;# 查看ORM翻譯成的SQL語句,僅適用於filter語句中,get會報錯!
    article = Article.objects.filter(title__exact='Hello World')
    # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` = Hello World

    # 三、None語句的查詢;
    # article = Article.objects.filter(title__exact=None)
    # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` IS NULL

    # 四、忽略大小寫的查詢,好比exact和iexact;
    article = Article.objects.filter(title__iexact='HELLO WORLD')
    # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE HELLO WORLD
    print(article)
    print(article.query)
    return HttpResponse('查詢成功!')


"""
小結:
一、exact翻譯成=;
二、iexact翻譯成LIKE;
"""

63-ORM查詢條件詳解-contains和icontains

63.1 query對象能夠查看ORM翻譯成的原生SQL語句是什麼;

63.2 contains和icontains的區別;

from django.shortcuts import render

from django.http import HttpResponse

# from .models import Article
from .models import *

# Create your views here.


# def index(request):
#     # 一、id =1和 id__exact =1 二者等價;
#     # article = Article.objects.filter(id__exact=1)# 二者等價!
#     # article = Article.objects.filter(id=1) # 二者等價!
#
#     # 二、 區分大小寫和不區分大小寫!涉及到MySQL數據庫的排序規則;# 查看ORM翻譯成的SQL語句,僅適用於filter語句中,get會報錯!
#     article = Article.objects.filter(title__exact='Hello World')
#     # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` = Hello World
#
#     # 三、None語句的查詢;
#     # article = Article.objects.filter(title__exact=None)
#     # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` IS NULL
#
#     # 四、忽略大小寫的查詢,好比exact和iexact;
#     article = Article.objects.filter(title__iexact='HELLO WORLD')
#     # SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE HELLO WORLD
#     print(article)
#     print(article.query)
#     return HttpResponse('查詢成功!')


"""
小結:
一、exact翻譯成=;
二、iexact翻譯成LIKE;
"""


def index1(request):
    article = Article.objects.filter(pk__exact=1)
    print(type(article))
    print(article)
    print(article.query)
    """
    <class 'django.db.models.query.QuerySet'>
    <QuerySet [<Article: Article object (1)>]>
    SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`id` = 1
    """
    return HttpResponse('index1')


def index2(request):
    # result = Article.objects.filter(title__contains='hello world')
    RESULT = Article.objects.filter(title__icontains='HELLO WORLD')
    print(RESULT)
    print(RESULT.query)

    """
    一、使用contains:
    <QuerySet []>
    SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE BINARY %hello world%
    二、使用icontains:
    <QuerySet [<Article: Article object (3)>]>
    SELECT `article`.`id`, `article`.`title`, `article`.`content` FROM `article` WHERE `article`.`title` LIKE %HELLO WORLD%
    """
    return HttpResponse('contains&icontains的區別,好比LIKE和LIKE BINARY')

64-ORM查詢條件詳解-in和關聯模型查詢

64.1 in能夠指定元組、列表以及QuerySet對象;

64.2 related_name='article' 的使用;

64.3 反向查詢是將模型的名字小寫化,好比‘article__in’

 

 

 

from django.db import models


# Create your models here.


class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    category = models.ForeignKey('Category',null=True, on_delete=models.CASCADE,related_name='article')

    class Meta:
        db_table = 'article'


class Category(models.Model):
    name = models.CharField(max_length=128)

    class Meta:
        db_table = 'category'

 

 

 

65-ORM查詢條件詳解-gt、gte、it和ite

66-ORM查詢條件詳解-startswith和endswith

67-ORM查詢條件詳解-range

68-ORM查詢條件詳解-date、time、year、week_day等

69-ORM查詢條件詳解-isnull和regex

70-ORM聚合函數詳解-準備工做

71-ORM聚合函數詳解-Avg

72-ORM聚合函數詳解-aggregate和annotate

73-ORM聚合函數詳解-Count

74-ORM聚合函數詳解-Max和Min

75-ORM聚合函數詳解-Sum

76-F表達式詳解

77-Q表達式詳解

78-objects對象所屬類原理剖析

79-QuerySet API詳解-filter、exclude、annotate

80-QuerySet API詳解-order_by

81-QuerySet API詳解-values和values_list

82-QuerySet API詳解-all方法

83-QuerySet API詳解-select_related

84-QuerySet API詳解-prefetch_related

85-QuerySet API詳解-defer和only

86-QuerySet API詳解-get方法

87-QuerySet API詳解-create方法

88-QuerySet API詳解-get_or_create和bulk_create

89-QuerySet API詳解-count和exists

90-QuerySet API詳解-distinct

91-QuerySet API詳解-update和delete

92-QuerySet API詳解-切片操做

93-QuerySet API詳解-QuerySet轉換爲SQL的條件

94-ORM做業講解-準備工做

95-ORM做業詳解(1)

96-ORM做業詳解(2)

97-ORM做業詳解(3)

98-ORM遷移詳解-migrations命令補充

99-ORM遷移詳解-migrate命令報錯解決方案

100-根據已有的表生成ORM模型詳解

101-Django數據庫練習題 

相關文章
相關標籤/搜索