Django學習筆記

来源:https://www.cnblogs.com/pigke/archive/2023/06/17/17487569.html
-Advertisement-
Play Games

## 1.常用命令 `創建項目:django-admin startproject 項目名` `創建APP(進入工程目錄):python manage.py startapp 網站名` `創建庫表(進入工程目錄):python manage.py makemigrations` `執行庫表建立(進入 ...


1.常用命令

創建項目:django-admin startproject 項目名

創建APP(進入工程目錄):python manage.py startapp 網站名

創建庫表(進入工程目錄):python manage.py makemigrations

執行庫表建立(進入工程目錄):python manage.py migrate

啟動運動:python manage.py runserver

模板渲染嵌入語法:在html可以嵌入後臺語言 區分符號-》> {%命令%} {{變數}}

2.編寫setting

在INSTALLED_APPS里添加APP的目錄名進去

改語言 LANGUAGE_CODE = 'zh-hans'

3.在APP目錄創建templates文件夾

渲染文件,用於存放html文件

4.編寫APP下的views

def index(request):
    return render(request,'index.html')

5.編寫項目urls(路由)

from myblog import views #導入views
path('',views.index) #路由頁面

#path轉換器:
int:<int:page>
str:<str:name>
slug:<slug:xxx>  #匹配帶符號的文本
path:<path:xxx>  #匹配地址包括/
    
#name命名
#模板中使用:{% url 'name' %}

#url反向解析
path('index',views.index,name='index_name') #路由頁面
{% url 'name' %}
{% url 'name' '參數值1' '參數值2' %}
{% url 'name' age='參數值1' name='參數值2' %} #命名傳參

6.在項目init下配置Mysql

import pymysql
pymysql.install_as_MySQLdb()

7.setting中配置MySQL

DATABASES = {
 'default': {
  'ENGINE': 'django.db.backends.mysql', # 資料庫引擎
  'NAME': 'django_mysql', # 資料庫名
  'USER': 'root', # 賬號
  'PASSWORD': 'root', # 密碼
  'HOST': '127.0.0.1', # HOST
  'POST': 3306, # 埠
 
 }
}

8.models.py模板

class Student(models.Model):
 """
 創建如下幾個表的欄位
 """
 # 學號 primary_key=True: 該欄位為主鍵
 studentNum = models.CharField('學號', primary_key=True, max_length=15)
 # 姓名 字元串 最大長度20
 name = models.CharField('姓名', max_length=20)
 # 年齡 整數 null=False, 表示該欄位不能為空
 age = models.IntegerField('年齡', null=False)
 # 性別 布爾類型 預設True: 男生 False:女生
 sex = models.BooleanField('性別', default=True)
 # 手機 unique=True 該欄位唯一
 mobile = models.CharField('手機', unique=True, max_length=15)
 # 創建時間 auto_now_add:只有在新增的時候才會生效
 createTime = models.DateTimeField(auto_now_add=True)
 # 修改時間 auto_now: 添加和修改都會改變時間
 modifyTime = models.DateTimeField(auto_now=True)
 
 # 指定表名 不指定預設APP名字——類名(app_demo_Student)
 class Meta:
	db_table = 'student' #表名
	verbose_name = '學生'  # 在admin站點中顯示的名稱
    verbose_name_plural = verbose_name  # 顯示的複數名稱
 def __str__(self):
	"""定義每個數據對象的顯示信息"""
	return self.name
#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    hname = models.CharField(max_length=20, verbose_name='名稱') 
    hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')  
    hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息') 
    hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書')  # 外鍵
    is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')

    class Meta:
        db_table = 'tb_heros'
        verbose_name = '英雄'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hname

資料庫表名:模型類如果未指明表名,Django預設以 小寫app應用名_小寫模型類名 為資料庫表名。

可通過db_table 指明資料庫表名。

9.資料庫的增刪改查

查詢數據

Student.objects.all() #獲取表中全部數據
Student.objects.all().order_by('-id') #id倒序
Student.objects.filter(name='tom1') #過濾查詢
Student.objects.get(name='tom1') #獲取一條數據,沒有就報錯
Student.objects.count() #查詢結果數量

Student.objects.values('colums') # 只返回指定欄位,字典
Student.objects.values_list('colums') # 只返回指定欄位,元組

過濾查詢

實現SQL中的where功能,包括

  • filter 過濾出多個結果
  • exclude 排除掉符合條件剩下的結果
  • get 過濾單一結果

1)相等

exact:表示判等。

例:查詢編號為3的圖書。

BookInfo.objects.filter(id__exact=3)
# 可簡寫為:
BookInfo.objects.filter(id=3)

2)模糊查詢

contains:是否包含。

說明:如果要包含%無需轉義,直接寫即可。

例:查詢書名包含’游’的圖書。

BookInfo.objects.filter(btitle__contains='游')

startswith、endswith:以指定值開頭或結尾。
例:查詢書名以’記’結尾的圖書

BookInfo.objects.filter(btitle__endswith='記')

以上運算符都區分大小寫,在這些運算符前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith.

3) 空查詢

isnull:是否為null。

例:查詢書名不為空的圖書。

BookInfo.objects.filter(btitle__isnull=False)

4) 範圍查詢

in:是否包含在範圍內。

例:查詢編號為1或3或5的圖書

BookInfo.objects.filter(id__in=[1, 3, 5])

5)比較查詢

gt :大於 (greater then)
gte :大於等於 (greater then equal)
lt :小於 (less then)
lte :小於等於 (less then equal)
例:查詢編號大於3的圖書

BookInfo.objects.filter(id__gt=3)

不等於的運算符,使用exclude()過濾器。

例:查詢編號不等於3的圖書

BookInfo.objects.exclude(id=3)

6)日期查詢

year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。

例:查詢1980年發表的圖書。

BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1日後發表的圖書。

BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

F對象

之前的查詢都是對象的屬性與常量值比較,兩個屬性怎麼比較呢? 答:使用F對象,被定義在django.db.models中。

語法如下:

F(屬性名)
例:查詢閱讀量大於等於評論量的圖書。

from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F對象上使用算數運算。

例:查詢閱讀量大於2倍評論量的圖書。

BookInfo.objects.filter(bread__gt=F('bcomment') * 2)

聚合函數

使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg(平均),Count(數量),Max(最大),Min(最小),Sum(求和),被定義在django.db.models中。

例:查詢圖書的總閱讀量。

from django.db.models import Sum
BookInfo.objects.aggregate(Sum('bread'))
# 註意aggregate的返回值是一個字典類型

排序

使用order_by對結果進行排序

BookInfo.objects.all().order_by('bread')  # 升序
BookInfo.objects.all().order_by('-bread')  # 降序

增加數據

create方式插入

通過 模型類.objects.create()保存。

HeroInfo.objects.create(
    hname='沙悟凈',
    hgender=0,
    hbook=book
)

save方式插入

from app_demo.models import Student
import random
"""
插入測試數據
"""
def insert(request):
 # 隨機整數 作為學號
 for i in range(0, 5):
  studentNum = int(random.uniform(0, 1) * 10000000000)
  # 從models文件中獲取student對象
  student = Student()
  # 給對象賦值
  student.studentNum = studentNum
  student.name = 'tom' + str(i)
  student.age = 15
  student.sex = random.choice([True, False])
  student.mobile = int(random.uniform(0, 1) * 10000000000)
  # 插入數據
  student.save()
 
 return HttpResponse('數據插入完畢')
from datetime import date
book = BookInfo(
    btitle='西游記',
    bput_date=date(1988,1,1),
    bread=10,
    bcomment=10
)
book.save()

修改數據

def modify(request, studentNum):
 # 通過學號獲取student對象
 student = Student.objects.get(studentNum=studentNum)
 # 設置student的name為jack
 student.name = 'jack'
 student.save()
 return HttpResponse('修改成功.')

save

修改模型類對象的屬性,然後執行save()方法

hero = HeroInfo.objects.get(hname='豬八戒')
hero.hname = '豬悟能'
hero.save()

update
使用模型類.objects.filter().update(),會返回受影響的行數

HeroInfo.objects.filter(hname='沙悟凈').update(hname='沙僧')

刪除數據

def delete(request, studentNum):
 student = Student.objects.get(studentNum=studentNum)
 student.delete()
 return HttpResponse('刪除成功.')

10.將models轉換為json

from django.core import serializers
tools = Tools.objects.all()
json_data = serializers.serialize('json', tools)
json_data = json.loads(json_data)

11.CORS跨域配置

下載corsheader

pip install django-cors-headers

修改setting.py中配置

在INSTALLED_APPS中增加corsheaders

INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'corsheaders',#這是我們的主角,放在新建的其他項目之前
     'app01',
 ]
 MIDDLEWARE = [
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'corsheaders.middleware.CorsMiddleware', #註意順序,必須放在這兒
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 ]

setting 里再進行這樣的配置

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True
#允許所有的請求頭
CORS_ALLOW_HEADERS = ('*')

12.模板標簽

if:
	{% if %}
	{% endif %}
for: 
	{% for i in list %}
	{% empty %}
	{% endfor %}

for內置變數-forloop:

變數 描述
forloop.counter 迴圈的當前迭代(從1開始索引)
forloop.counter0 迴圈的當前迭代(從0開始索引)
forloop.revcounter counter值的倒序
forloop.revcounter0 counter0值的倒序
forloop.first 如果是第一次迴圈,則為真
forloop.last 如果是最後一次迴圈,則為真
forloop.parenloop 當嵌套迴圈,parentloop表示外層迴圈

模板過濾器

語法:{{ 變數 | 過濾器1:'參數值1' | 過濾器2:'參數值2' ...}}

常用過濾器

過濾器 說明
lower 將字元串轉換為全部小寫
upper 將字元串轉會為大寫形式
safe 預設不對變數內的字元串進行html轉義
add:"n" 將value的值增加n
truncatechars:'n' 如果字元串字元多於指定的字元數量,那麼會被截斷。截斷的字元串將以可翻譯的省略號序列(“.….")結尾。

模板繼承

父模板:
    {% block block_name %}
    {% endblock %}

子模板:
    開頭使用:{% extends %}
    {% block block_name %}  #block_name與父模板對應
    {% endblock %}

簡化變數

{& with val.xxx as i &}
{% endwith %}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第17面: > 面試官:聊一聊指針? > > 二師兄:好的。 > > 面試官:你覺得指針本質上是什麼? > > 二師兄:這要從記憶體地址開始說起了。如果有一塊容量是1G的記憶體,假設它的地址是從`0x00000000` 到`0x3fffffff`,每一個 ...
  • # Java 註釋、絕對路徑、相對路徑、基本Dos命令 # 1. Java的三種註釋方式 ## 註釋能增加代碼的可讀性,習慣寫註釋能提升我們編寫代碼的能力 > ### 單行註釋:用//註釋一些代碼提示 > > ### 多行註釋:以/*為開頭 以 */為結束 > > ### 文檔註釋:/* > > # ...
  • # 1.Java 發展歷史 ### 由高斯林創建 1995年由甲骨文公司收購併發出第一版本,目前使用最多是Java8 及 Java11 原因是這兩個版本都是長期支持維護的,企業用的也比較多。 # 2.Java的一些特點 > ### 跨平臺性:主要是因為每個平臺都裝有 JVM > ### Java 是 ...
  • #### 1. 跳出/執行下一次迴圈。 ``` {標簽名}: for true { ... for true { ... break/continue {標簽名} //預設不加標簽,則跳出最近一層迴圈。加了標簽可以跳出標簽定義處所在迴圈 } } ``` #### 2. map的使用註意項。 因為ma ...
  • 最近在弄文件上傳、下載、線上預覽時經常需要設置請求標頭或者響應標頭的Content-Type 屬性。所以研究了一下spring支持哪些Content-Type,通過研究MediaTypeFactory.getMediaType的源碼,可以得知spring是將支持的Content-Type 維護在/o... ...
  • # Go 語言之在 gin 框架中使用 zap 日誌庫 ### gin 框架預設使用的是自帶的日誌 #### `gin.Default()`的源碼 Logger(), Recovery() ```go func Default() *Engine { debugPrintWARNINGDefault ...
  • ## 概述 Nginx 是一個高性能的 HTTP 和反向代理伺服器,特點是占用記憶體少,併發能力強 #### 1. 正向代理 如果把區域網外的 Internet 想象成一個巨大的資源庫,則區域網中的客戶端要訪問 Internet,需要通過代理伺服器來訪問,這種訪問就稱為正向代理 ![](https:/ ...
  • # 類和對象 **組成結構** • 構造函數: 在創建對象的時候給屬性賦值 • 成員變數: • 成員方法(函數) • 局部變數 • 代碼塊 ## 構造器 每個類都有一個主構造器,這個構造器和類定義"交織"在一起類名後面的內容就是主構造器,如果參數列表為空的話,()可以省略 scala的類有且僅有一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...