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 = https://www.cnblogs.com/pigke/p/serializers.serialize('json', tools)
json_data = https://www.cnblogs.com/pigke/p/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 %}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555433.html
標籤:Python
上一篇:Java 注釋及Dos命令
下一篇:返回列表
