Django(個(gè)人推薦, 如果項(xiàng)目較大 需要協(xié)同開(kāi)發(fā), 建議使用django這種重量級(jí)框架, 如果類似于純api的后端應(yīng)用建議使用 flask, 輕量小巧 , 麻雀雖小五臟俱全)
1.Django是什么
他是一個(gè)基于python語(yǔ)言的WEB框架
2.創(chuàng)建Django項(xiàng)目
?啟動(dòng)django web服務(wù)器 python3 manage.py runserver 0.0.0.0:8000
?retrun HttpResponse方法返回我們定義的數(shù)據(jù)
3.模板初探
- 1.配置settings DIRS
- 2.配置views.py return render(request,'form.html')
- MVC & MTV
- m model 模型 一般對(duì)數(shù)據(jù)庫(kù)操作,,數(shù)據(jù)的存取 models.py
- v views 視圖 決定著如何展示數(shù)據(jù) views.py
- c controller 控制器 負(fù)責(zé)處理用戶交互的部分,,控制器負(fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,,并向模型發(fā)送數(shù)據(jù). urls.py
Django是一個(gè)MTV框架,,其框架模板上看起來(lái)和傳統(tǒng)的MVC架構(gòu)沒(méi)有什么太大的區(qū)別.
Django將MVC中的視圖進(jìn)一步分解為Django視圖和Django模板兩個(gè)部分
?- Django中的html文件就是模板 視圖就是views.py
-
T 就是Templates 數(shù)據(jù)展示
在Django的MTV框架中MVC C控制器部分由Django框架的urlconf來(lái)實(shí)現(xiàn)代替
嚴(yán)格來(lái)說(shuō)Django是MVTC C被實(shí)現(xiàn)替代了
urls.py文件中 re_path是使用正則匹配用戶請(qǐng)求的url 主要配合動(dòng)態(tài)路由
-
Django路由的匹配心法
-
Django 在2.0之后使用了新的語(yǔ)法path,不使用re_path
-
path('articles/<int:arg1>/<month:arg2>/<int:arg3>', views.kw)
-
str 字符串 除了/ 之外的任何字符串都能匹配
-
int 匹配任意數(shù)字
-
slug 匹配任意的**-**-**
-
uuid 匹配uuid格式的,特定場(chǎng)景下才會(huì)使用的到
-
path / + str 可以匹配到/
-
使用include管理app下的url
-
在頂級(jí)的urls.py文件中導(dǎo)入from django.urls import include
-
path('app01/',include('app01.urls')),
-
Django的模型(admin文件的操作)
- views中操作數(shù)據(jù)庫(kù)
- 自己寫sql語(yǔ)句的問(wèn)題 - 有sql注入的風(fēng)險(xiǎn),,代碼與sql寫死在一起了,,導(dǎo)致解耦性差,開(kāi)發(fā)人員的sql水平層次不齊,,導(dǎo)致性能可能會(huì)變差,,開(kāi)發(fā)效率低下
4.ORM的引出
-
ORM是什么?
- 對(duì)象關(guān)系映射,,他的實(shí)質(zhì)就是將關(guān)系數(shù)據(jù)庫(kù)中的業(yè)務(wù)數(shù)據(jù)用對(duì)象的形式表示出來(lái),,并通過(guò)面向?qū)ο蟮姆绞綄⑦@些對(duì)象組織起來(lái),實(shí)現(xiàn)系統(tǒng)業(yè)務(wù)邏輯過(guò)程
- ORM中最重要的概念就是映射,,通過(guò)這種映射可以使業(yè)務(wù)對(duì)象與數(shù)據(jù)庫(kù)分離,,從面向?qū)ο髞?lái)說(shuō),數(shù)據(jù)庫(kù)不應(yīng)該和業(yè)務(wù)邏輯綁定到一起,,ORM則起到這樣的分離作用,,使數(shù)據(jù)庫(kù)層透明,開(kāi)發(fā)人員真正的面向?qū)ο螅?/li>
-
ORM的作用
- 實(shí)現(xiàn)了代碼與數(shù)據(jù)庫(kù)操作的解耦
- 不需要自己寫原生的sql,,提高了開(kāi)發(fā)效率
- 有效的防止了sql注入
- 缺點(diǎn)
- 犧牲性能?。?duì)象轉(zhuǎn)換成原生的sql
- 復(fù)雜語(yǔ)句難以實(shí)現(xiàn)
-
ORM映射字段的語(yǔ)法
-
AutoField (設(shè)置自增)
-
BigAutoField (設(shè)置更大的自增)
-
BigIntegerField (更大的整數(shù))
-
BinaryField (二進(jìn)制的數(shù)據(jù))
-
BooleanField (布爾類型的數(shù)據(jù))
-
CharField (字符串類型的數(shù)據(jù))
-
DateField (年與日時(shí)間類型)
-
DataTimeField(精確到時(shí)分秒的時(shí)間類型)
-
DecimalField ()
-
DurationField()
-
EmailField(郵箱類型)
-
FileField(存儲(chǔ)文件的類型)
-
FloatField(浮點(diǎn)數(shù)類型)
-
ImageField(圖片類型)
-
IntegerField(整數(shù)類型)
-
GenericIPAddressField(ipv4地址類型)
-
NullBooleanField (允許boolean類型為空)
-
TextField(大的文本)
-
ForeignKey(外鍵關(guān)聯(lián))
-
ManyToManyField(多對(duì)多)
-
OneToOneField(1對(duì)1)
-
將models文件中的類同步到mysql數(shù)據(jù)庫(kù)中(必須要注意models文件中的外鍵和多對(duì)多要一一對(duì)應(yīng))
-
在Django官網(wǎng)找到數(shù)據(jù)庫(kù)的配置https://docs./en/3.0/ref/settings/#databases 寫到settings文件當(dāng)中
-
在項(xiàng)目下的init.py文件中寫入
-
import pymysql
pymysql.version_info = (1, 3, 13,"final",0)
pymysql.install_as_MySQLdb()
-
創(chuàng)建數(shù)據(jù)庫(kù)mysql> create database blogdatabase charset utf8;
-
在settings文件中設(shè)置INSTALLED_APPS 加上app的名字
-
使用Django數(shù)據(jù)庫(kù)的同步工具migrations
- 1.生成同步文件 python manage.py makemigrations
- 2.同步數(shù)據(jù)庫(kù) python manage.py migrate
-
使用ORM映射插入數(shù)據(jù) 首先 python manage.py shell
-
普通創(chuàng)建
>>> models.Account.objects.create(
>>> ... username = 'jeke',
>>> ... email = '[email protected]',
>>> ... password = '123',
>>> ... )
-
外鍵關(guān)聯(lián)創(chuàng)建
>>> o = models.Article(
>>> ... title = '我是Peter',
>>> ... content = 'xixi',
>>> ... pub_data = '2020-6-11')
>>> o
>>> <Article: Article object (None)>
>>> o.account_id = 1
>
>>> o.save()
-
多對(duì)多的創(chuàng)建數(shù)據(jù)
- 先創(chuàng)建完對(duì)象在關(guān)聯(lián)o.tags.set([id,id]) 這是覆蓋性設(shè)置
- o.tags.add(id,id) 這是添加
-
ORM對(duì)數(shù)據(jù)進(jìn)行查詢(后來(lái)找到的查詢語(yǔ)法https://www.cnblogs.com/ls1997/p/10955402.html)
-
models.Account.objects.all() ==> select *
-
models.Account.objects.filter(id=1) ==> select * where id=1
-
models.Account.objects.filter(id__gt=1) ==> where id > 1
-
models.Account.objects.filter(id__gt=1,password='111') ==> where id >1 and password ='111';
-
models.Account.objects.filter(password__startswith=1) ==> where password like '1%'
-
models.Account.objects.filter(username__contains='zj') ==> 只要username包含大小寫的zj
-
models.Account.objects.filter(username__icontains='zj') ==> 只能匹配到小寫的zj
-
models.Account.objects.filter(id__in=[1,2]) ==> where id in (1,2)
-
models.Account.objects.filter(username__endswith='j') ==> where username like '%j'
-
日期的待補(bǔ)充
-
filter正則表達(dá)式
- models.Account.objects.filter(username__regex=r'(zj|j)$') 以zj或者j結(jié)尾
- models.Account.objects.filter(username__iregex=r'(zj|j)$') 加上i就是大小寫不敏感都匹配
-
上邊拿到的都是queryset的對(duì)象,不是數(shù)據(jù),,想要拿到數(shù)據(jù)可以使用很多方法
>>> a = models.Account.objects.filter(username__regex=r'(zj|j)$')
>>> b = a.values()
>>> b.values('id').order_by('id') #升序
<QuerySet [{'id': 2}, {'id': 3}]>
>>> b.values('id').order_by('-id')
<QuerySet [{'id': 3}, {'id': 2}]> #降序
>>> *想要用reverse 必須要用先order_by排序*
>>> b.values('id').order_by('-id').reverse() #翻轉(zhuǎn)
<QuerySet [{'id': 2}, {'id': 3}]>
>>> b.values('id').order_by('id').reverse().first() #取最后一個(gè)值,,先翻轉(zhuǎn)在取第一個(gè)
{'id': 3}
5.ORM語(yǔ)句總結(jié)
-
a = models.Account.objects.get(id=1) 精確查詢某一字段 #返回的是真實(shí)的對(duì)象了,不是queryset對(duì)象了
直接調(diào)用a.id a.username 即可
-
models.Account.objects.exclude(id=1)
<QuerySet [<Account: Account object (2)>, <Account: Account object (3)>]>
get 返回一個(gè)對(duì)象,,沒(méi)有或者多個(gè)會(huì)報(bào)錯(cuò),不常用但是要不filter查詢速率快
filter 返回多個(gè)對(duì)象
all 返回所有數(shù)據(jù)
exclude 排除符合匹配條件的數(shù)據(jù),,返回其他的數(shù)據(jù)
>>> models.Account.objects.exclude(id=1).update(password='1234656') #批量修改只要是id不等于1的密碼都改成123456
>>> a = models.Account.objects.get(id=1)
>>> a.password = '123456789'
>>> a.save()
- 批量刪除,關(guān)聯(lián)的表的數(shù)據(jù)也會(huì)刪除或者變成設(shè)置的默認(rèn)的
>>> models.Account.objects.get(password='123456').delete()
>>> a = models.Account.objects.get(id=1)
>>> a.delete()
外鍵關(guān)聯(lián)操作(模塊創(chuàng)建)
正向外鍵關(guān)聯(lián)(在有關(guān)聯(lián)字段的表中查詢)
>>> a = models.Article.objects.create(title = 'hahahaha322332', content = '阿光高你剛42151啊方法',account_id = 8 ,pub_data = '2020-06-12')
>>> a.account.id # a 定義的是Article的數(shù)據(jù),,但是可以通過(guò)外鍵關(guān)聯(lián)到Account 查詢到Account的數(shù)據(jù)
反向外鍵關(guān)聯(lián)(無(wú)關(guān)聯(lián)字段的表中查詢, ORM會(huì)自動(dòng)的幫助我們創(chuàng)建一個(gè)表)
>>> obj = models.Account.objects.all()[0]
>>> obj.article_set.all()
<QuerySet [<Article: Article object (6)>]>
>>> obj.article_set.all().values()
<QuerySet [{'id': 6, 'title': 'hahahaha', 'content': '阿光高你剛啊方法', 'account_id': 4, 'pub_data': datetime.date(2020, 6, 12)}]>
多對(duì)多關(guān)聯(lián)
>>> a.tags.all()
>>> t = models.tag.objects.all()[1]
>>> t.article_set.all()
6.Django Admin (組件)
admin 是Django自帶的讓你用來(lái)進(jìn)行數(shù)據(jù)庫(kù)管理的web app
提供了很多定制化的功能,,你甚至可以用它來(lái)進(jìn)行公司內(nèi)部的內(nèi)容管理
首先創(chuàng)建登錄的用戶 >> python3 manage.py createsuperuser
如果app01想要被管理的話,必須授權(quán)允許管理admin.py文件寫入下面的內(nèi)容
from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.Account)
admin.site.register(models.Article)
admin.site.register(models.Tag)
開(kāi)啟Django >> python3 manage.py runserver 0.0.0.0:8000
打開(kāi)localhost:8000/admin 就可以看到對(duì)應(yīng)的數(shù)據(jù)庫(kù)進(jìn)行操作了
7.定制Django admin
from django.contrib import admin
from app01 import models
class AccountAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'signature') # 顯示這三個(gè)字段
search_fields = ('username', 'email','signature') # 加入搜索按鈕
list_filter = ('email', ) # 過(guò)濾, 針對(duì)重復(fù)的字段過(guò)濾
list_per_page = 2 # 設(shè)置分頁(yè)
# list_display_links = ('email',)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'content', 'account', 'pub_data')
list_filter = ('account', 'pub_data')
search_fielshituds = ('title',)
fields = ('title', 'content', ('pub_data', 'account', 'tags')) # 設(shè)置admin修改創(chuàng)建頁(yè)面可修改的數(shù)據(jù)
exclude = ('account',) # 排除不顯示一些字段
date_hierarchy = 'pub_data' # 按照時(shí)間的分組(只能用時(shí)間)
fieldsets = (
('文章基本信息', {
'fields': ['title', 'content'],
},
),
('高級(jí)選項(xiàng)', {
'fields': ['account', 'tags', 'pub_data'],
'classes': ('collapse',), # 讓這個(gè)高級(jí)選項(xiàng)變成有收縮折疊功能
}
)
)
filter_horizontal = ('tags',) # 只能針對(duì)多對(duì)多
filter_vertical = ('tags',)
radio_fields = {'account': admin.VERTICAL} # 將下拉框變成按鈕以供選擇
autocomplete_fields = ['account',]
readonly_fields = ('title',) # 設(shè)置只讀字段
admin.site.register(models.Account,AccountAdmin)
admin.site.register(models.Article,ArticleAdmin)
admin.site.register(models.Tag)
-
自定義Admin字段
在models文件中寫入
def get_comment(self):
return 10
再在admin對(duì)應(yīng)的庫(kù)中加上list_display = ('get_comment',) 字段
class Meta:
# verbose_name = "用戶列表" # 針對(duì)英文的
verbose_name_plural = '用戶列表' # 針對(duì)中文的
8.views 視圖(views文件的操作)
from django.views import view
class TestView(View):
def get(self,request):
return HttpResponse("測(cè)試get請(qǐng)求自動(dòng)的使用這個(gè)get()函數(shù)")
def post(self,request):
return HttpResponse("測(cè)試post")
在url 定義的時(shí)候加入as.view()方法
path('class_view',view.TestView.as_view())
很久沒(méi)有整理之前的筆記了....
|