他是一個基於python語言的WEB框架
爲何使用Djangocss
Django的優點html
經過wsgi模塊理解Django的工做集成原理前端
wsgi是一種規範,wsgiref是基於wsgi規範開發的模塊python
django-admin.py startproject my_site 建立my_site項目mysql
第一次django請求web
啓動django web服務器 python3 manage.py runserver 0.0.0.0:8000ajax
retrun HttpResponse方法返回咱們定義的數據正則表達式
Django是一個MTV框架,其框架模板上看起來和傳統的MVC架構沒有什麼太大的區別.sql
Django將MVC中的視圖進一步分解爲Django視圖和Django模板兩個部分shell
- Django中的html文件就是模板 視圖就是views.py
T 就是Templates 數據展現
在Django的MTV框架中MVC C控制器部分由Django框架的urlconf來實現代替
嚴格來講Django是MVTC C被實現替代了
urls.py文件中 re_path是使用正則匹配用戶請求的url 主要配合動態路由
Django路由的匹配心法
Django 在2.0以後使用了新的語法path,不使用re_path
path('articles/<int:arg1>/<month:arg2>/<int:arg3>', views.kw)
str 字符串 除了/ 以外的任何字符串都能匹配
int 匹配任意數字
slug 匹配任意的**-**-**
uuid 匹配uuid格式的,特定場景下才會使用的到
path / + str 能夠匹配到/
使用include管理app下的url
在頂級的urls.py文件中導入from django.urls import include
path('app01/',include('app01.urls')),
Django的模型(admin文件的操做)
ORM是什麼?
ORM的做用
ORM映射字段的語法
AutoField (設置自增)
BigAutoField (設置更大的自增)
BigIntegerField (更大的整數)
BinaryField (二進制的數據)
BooleanField (布爾類型的數據)
CharField (字符串類型的數據)
DateField (年與日時間類型)
DataTimeField(精確到時分秒的時間類型)
DecimalField ()
DurationField()
EmailField(郵箱類型)
FileField(存儲文件的類型)
FloatField(浮點數類型)
ImageField(圖片類型)
IntegerField(整數類型)
GenericIPAddressField(ipv4地址類型)
NullBooleanField (容許boolean類型爲空)
TextField(大的文本)
ForeignKey(外鍵關聯)
ManyToManyField(多對多)
OneToOneField(1對1)
將models文件中的類同步到mysql數據庫中(必需要注意models文件中的外鍵和多對多要一一對應)
在Django官網找到數據庫的配置https://docs.djangoproject.com/en/3.0/ref/settings/#databases 寫到settings文件當中
在項目下的init.py文件中寫入
import pymysql pymysql.version_info = (1, 3, 13,"final",0) pymysql.install_as_MySQLdb()
建立數據庫mysql> create database blogdatabase charset utf8;
在settings文件中設置INSTALLED_APPS 加上app的名字
使用Django數據庫的同步工具migrations
使用ORM映射插入數據 首先 python manage.py shell
普通建立
>>> models.Account.objects.create( >>> ... username = 'jeke', >>> ... email = '123@163.com', >>> ... password = '123', >>> ... )
外鍵關聯建立
>>> o = models.Article( >>> ... title = '我是Peter', >>> ... content = 'xixi', >>> ... pub_data = '2020-6-11') >>> o >>> <Article: Article object (None)> >>> o.account_id = 1 > >>> o.save()
多對多的建立數據
ORM對數據進行查詢(後來找到的查詢語法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'
日期的待補充
filter正則表達式
上邊拿到的都是queryset的對象,不是數據,想要拿到數據可使用不少方法
>>> 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() #翻轉 <QuerySet [{'id': 2}, {'id': 3}]> >>> b.values('id').order_by('id').reverse().first() #取最後一個值,先翻轉在取第一個 {'id': 3}
a = models.Account.objects.get(id=1) 精確查詢某一字段 #返回的是真實的對象了,不是queryset對象了
直接調用a.id a.username 便可
models.Account.objects.exclude(id=1)
<QuerySet [<Account: Account object (2)>, <Account: Account object (3)>]>
get 返回一個對象,沒有或者多個會報錯,不經常使用可是要不filter查詢速率快
filter 返回多個對象
all 返回全部數據
exclude 排除符合匹配條件的數據,返回其餘的數據
>>> models.Account.objects.exclude(id=1).update(password='1234656') #批量修改只要是id不等於1的密碼都改爲123456
>>> a = models.Account.objects.get(id=1) >>> a.password = '123456789' >>> a.save()
>>> models.Account.objects.get(password='123456').delete()
>>> a = models.Account.objects.get(id=1) >>> a.delete()
外鍵關聯操做(模塊建立)
正向外鍵關聯(在有關聯字段的表中查詢)
>>> a = models.Article.objects.create(title = 'hahahaha322332', content = '阿光高你剛42151啊方法',account_id = 8 ,pub_data = '2020-06-12') >>> a.account.id # a 定義的是Article的數據,可是能夠經過外鍵關聯到Account 查詢到Account的數據
反向外鍵關聯(無關聯字段的表中查詢, ORM會自動的幫助咱們建立一個表)
>>> 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)}]>
多對多關聯
>>> a.tags.all() >>> t = models.tag.objects.all()[1] >>> t.article_set.all()
admin 是Django自帶的讓你用來進行數據庫管理的web app
提供了不少定製化的功能,你甚至能夠用它來進行公司內部的內容管理
首先建立登陸的用戶 >> python3 manage.py createsuperuser
若是app01想要被管理的話,必須受權容許管理admin.py文件寫入下面的內容
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)
開啓Django >> python3 manage.py runserver 0.0.0.0:8000
打開localhost:8000/admin 就能夠看到對應的數據庫進行操做了
from django.contrib import admin from app01 import models class AccountAdmin(admin.ModelAdmin): list_display = ('username', 'email', 'signature') # 顯示這三個字段 search_fields = ('username', 'email','signature') # 加入搜索按鈕 list_filter = ('email', ) # 過濾, 針對重複的字段過濾 list_per_page = 2 # 設置分頁 # 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')) # 設置admin修改建立頁面可修改的數據 exclude = ('account',) # 排除不顯示一些字段 date_hierarchy = 'pub_data' # 按照時間的分組(只能用時間) fieldsets = ( ('文章基本信息', { 'fields': ['title', 'content'], }, ), ('高級選項', { 'fields': ['account', 'tags', 'pub_data'], 'classes': ('collapse',), # 讓這個高級選項變成有收縮摺疊功能 } ) ) filter_horizontal = ('tags',) # 只能針對多對多 filter_vertical = ('tags',) radio_fields = {'account': admin.VERTICAL} # 將下拉框變成按鈕以供選擇 autocomplete_fields = ['account',] readonly_fields = ('title',) # 設置只讀字段 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對應的庫中加上list_display = ('get_comment',) 字段
自定義字段名 在,models中修改
signature = models.CharField("簽名", max_length=255, null=True) # null容許值爲空,簽名
自定義表名 在models文件中類中加入
class Meta: # verbose_name = "用戶列表" # 針對英文的 verbose_name_plural = '用戶列表' # 針對中文的
視圖中的字段拋開講解
HttpRequest對象屬性
除了屬性HttpRequest的方法
Httpresponse(content_type格式參考手冊https://www.w3school.com.cn/media/media_mimeref.asp)
設置下載文件的方法
def download(request): f = open("static_data/15s第三方軟件設備適配狀況.xlsx", 'rb') res = HttpResponse(f.read(),content_type='application/vnd.ms-excel') # 設置返回的內容格式爲excel文檔格式 res['Content-Disposition'] = 'attachment; filename ="15s.xlsx"' # 設置用戶請求的時候下載下來的是一個attachement附件和文件名 return res
設置重定向
def redirect(request): return HttpResponseRedirect("/app01/download")
CBV(class base view) 類視圖
from django.views import view class TestView(View): def get(self,request): return HttpResponse("測試get請求自動的使用這個get()函數") def post(self,request): return HttpResponse("測試post")
在url 定義的時候加入as.view()方法
path('class_view',view.TestView.as_view())