日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python框架django入门_web框架之Django(python3入门)

發(fā)布時(shí)間:2024/9/19 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python框架django入门_web框架之Django(python3入门) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

-ORM

ORM是什么?

不是django獨(dú)有或者python獨(dú)有的

對(duì)象關(guān)系映射

python中主流的幾個(gè)ORM框架

django的orm(django已經(jīng)封裝好了,必須在django中使用)

sqlAchemy 第三方的orm框架(這個(gè)可以單獨(dú)拿出來(lái)使用)---Flask框架并沒(méi)有orm,會(huì)用到sqlAchemy

自己寫(xiě)

orm不能創(chuàng)建數(shù)據(jù)庫(kù),只能創(chuàng)建表,刪除表,新增字段,刪除字段

通過(guò)orm創(chuàng)建user表

第一步 在settings.py配置

DATABASES={'ENGINE':'django.db.backends.mysql','NAME':'數(shù)據(jù)庫(kù)名字','HOST':'mysql IP','PORT':3306,'USER':'數(shù)據(jù)庫(kù)用戶名','PASSWORD':'數(shù)據(jù)庫(kù)密碼'}

第二步 鏈接數(shù)據(jù)庫(kù),操作數(shù)據(jù)庫(kù)的模塊(pymysql)- mysqlDB 只能python 2.x用(django內(nèi)置這個(gè)模塊)-pymysql python2.x 和3.x 都可以用-所以需要在__init__.py下寫(xiě)一行代碼(一般情況 寫(xiě)在app下面的__init__中)importpymysql#讓pymysql替換掉原來(lái)django中內(nèi)置的mysqldb的地方,以后操作mysql,就用pymysql這個(gè)模塊

pymysql.install_as_MySQLdb()

第三步 創(chuàng)建一個(gè)表(在models.py中創(chuàng)建新表)#創(chuàng)建一個(gè)user表,在orm中,其實(shí)就是寫(xiě)一個(gè)類

classUser(models.Model):#在這個(gè)類中,寫(xiě)入需要?jiǎng)?chuàng)建的字段

#id字段,自增,int類型,是主鍵

id = models.AutoField(primary_key=True)#name字段,varchar類型 ,長(zhǎng)度32

name = models.CharField(max_length=32)#pwd字段,varchar類型 ,長(zhǎng)度32,可以為空

pwd = models.CharField(max_length=32, null=True)

第四步:

把新建表同步到數(shù)據(jù)庫(kù),django項(xiàng)目中的migrations文件夾存放數(shù)據(jù)庫(kù)遷移的記錄

按次序執(zhí)行下面兩條指令:

python3 manage.py makemigrations#數(shù)據(jù)表變化的記錄

python3 manage.py migrate #數(shù)據(jù)庫(kù)同步命令(數(shù)據(jù)庫(kù)的表就會(huì)發(fā)生變化)

-通過(guò)orm創(chuàng)建user表

通過(guò)上面的四個(gè)步驟,就可以創(chuàng)建出user表

新增表、刪除表、新增字段、刪除字段--- 一個(gè)class就是一張表,刪除=注釋代碼+執(zhí)行兩條命令,新增=新增字段代碼+執(zhí)行兩條命令classUser(models.Model):#在這個(gè)類中,寫(xiě)入需要?jiǎng)?chuàng)建的字段

#id字段,自增,int類型,是主鍵

id = models.AutoField(primary_key=True)#name字段,varchar類型 ,長(zhǎng)度32

name = models.CharField(max_length=32)#pwd字段,varchar類型 ,長(zhǎng)度32,可以為空

pwd = models.CharField(max_length=32, null=True)#增加字段

xx = models.CharField(max_length=64)## 再增加個(gè)字段

#yy = models.CharField(max_length=64, null=True)

# ## 再增加一個(gè)字段

#zz = models.CharField(max_length=64, null=True, default='www')

# ## 刪除字段(只要注釋掉 然后兩條命令同步下就好了)

方式一:

在termimal中執(zhí)行 python3 manage.py makemigrations

python3 manage.py migrate

方式二:

pycharm-tools-‘run manage.py Task..'-在命令輸入框中輸入migrations-在命令輸入框中輸入migrate

1單表的增刪改查#為了驗(yàn)證測(cè)試方便,寫(xiě)了這個(gè)腳本 用來(lái)驗(yàn)證orm 數(shù)據(jù)增刪改查

importosif __name__ == '__main__':

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ORM_Proj.settings')importdjango

django.setup()from app01 importmodels

(緊接著 上面的腳本寫(xiě)下去)#新增用戶

#方式一,通過(guò)對(duì)象來(lái)保存數(shù)據(jù)

#user = models.User(username=name, passwd=pwd)

#user.save()

#return HttpResponse('新增成功')

#方式二 表模型 (常用方式)

#user = models.User.objects.create(username=name,passwd=pwd)

#print(user.username)

# #return HttpResponse('create successful')

#查詢id=1的用戶

#ret = models.User.objects.filter(id=1) #結(jié)果是queryset對(duì)象,內(nèi)部套了一個(gè)個(gè)的對(duì)象(理解為是一個(gè)列表)

#查詢名字為lich的數(shù)據(jù)

#ret = models.User.objects.filter(username='lich').first() #結(jié)果是User對(duì)象,取出查詢結(jié)果中的第一條數(shù)據(jù)

#ret = models.User.objects.filter(username='lich')

#print(ret)

#刪除的第一種方式: 把id=1的人刪除(先查詢后刪除)

#ret = models.User.objects.filter(id=1).delete() #把查詢出來(lái)的所有結(jié)果刪除

#print(ret)

#刪除的第二種方式:刪除id=6的這個(gè)人(查詢出對(duì)象,刪除對(duì)象)

#ret = models.User.objects.filter(id=6).first()

#print(ret.username)

#print(ret.passwd)

#ret.delete()

#修改數(shù)據(jù)的第一種方式: 修改id=5 的人的name為xxx

#ret = models.User.objects.filter(id=5).update(username = 'xxx') #所有查詢出來(lái)的數(shù)據(jù)都更新

#print(ret) #ret是影響的行數(shù)

#修改數(shù)據(jù)的第二種方式:

user = models.User.objects.filter(id=5).first()

user.username= 'xxx'

#沒(méi)有user.update()

user.save() #既可以保存 又可以更新

print(user.username)2單表的其他操作### 單表的其他操作

#<1> all()返回queryset對(duì)象,查詢表中所有記錄

#ret = models.User.objects.all() #把它當(dāng)成queryset對(duì)象

#print(ret)

#<2> filter(**kwargs)返回queryset對(duì)象, 這種形式是'id=3 pwd=333' 是and條件

#ret = models.User.objects.filter(id=5,passwd='333')

#ret = models.User.objects.filter(id=5,passwd='123') #和下面的一樣一樣的

#ret = models.User.objects.filter(**{'id':5,'passwd':'123'})

#print(ret)

#get(**kwargs)的返回值是User對(duì)象

#get查詢的結(jié)果有且只有一個(gè)值才行,否則程序會(huì)報(bào)錯(cuò)

#user = models.User.objects.get(id=5)

#print(type(user))

#exclude(**kwargs)除了條件的記錄以外的

#ret = models.User.objects.exclude(id=3)

#print(ret)

#order_by

#ret = models.User.objects.all().order_by('username') # 查詢出所有記錄,升序排列

#ret = models.User.objects.all().order_by('-username') # 查詢出所有記錄,降序排列

#print(ret.query) #打印原生sql

#print(ret)

#reverse() 必須用在order_by之后

#ret = models.User.objects.all().order_by('passwd')

#ret = models.User.objects.all().order_by('passwd').reverse()

#print(ret)

#count()計(jì)算查詢結(jié)果的總條目數(shù)

#ret = models.User.objects.all().count()

#ret = models.User.objects.filter(username='a').first()

#print(ret)

#exists()查詢queryset對(duì)象的結(jié)果是否為空,返回的結(jié)果是true或false

#ret = models.User.objects.filter(id=10).exists()

#ret = models.User.objects.filter(id=8).exists()

#print(ret)

#values() 返回一個(gè)valueQueryset,運(yùn)行后得到一個(gè)可迭代的字典序列

#ret = models.User.objects.all().values('username','passwd')

#print(ret)

#print(ret.first())

#values_list() 直接將取到的結(jié)果 組成一個(gè)元組

#ret = models.User.objects.all().values_list('username','passwd')

#print(ret)

#distinct 記錄去重

#ret = models.User.objects.filter(username='lich')

#ret = models.User.objects.filter(username='lich').values('username').distinct()

#print(ret)

### 模糊查詢 使用__ 雙下劃線(基于__的模糊查詢)

#in 查詢id=1-7之中,的所有記錄

#ret = models.User.objects.filter(id__in=[1,2,3,4,5,6,7])

#print(ret)

#print(ret.query)

#range between...and...

#ret = models.User.objects.filter(id__range=[1,7])

#print(ret)

#print(ret.query)

#大于,小于,大于等于,小于等于

#ret = models.User.objects.filter(id__gt=9) #大于

#ret = models.User.objects.filter(id__gte=9) #大于等于

#ret = models.User.objects.filter(id__lt=7) #小于

#ret = models.User.objects.filter(id__lte=7) #小于等于

#print(ret)

#startswith 以xx開(kāi)頭

#ret = models.User.objects.filter(username__startswith='l')

#print(ret)

#contains 包含xx

ret = models.User.objects.filter(username__contains='i') #嚴(yán)格大小寫(xiě)包含

ret = models.User.objects.filter(username__icontains='i') #忽略大小寫(xiě)包含

print(ret)3表操作(增刪改)-一對(duì)一#一對(duì)一新增(注意所在database的字符集)

#第一種方式:先新增author_detail

#author_detail = models.AuthorDetail.objects.create(addr='南京',phone='132111')

#author = models.Author.objects.create(name='lich',age=19,author_detail_id=author_detail.id)

#author_detail.pk 是主鍵

#author = models.Author.objects.create(name='lich',age=19,author_detail_id=author_detail.pk)

#第二種方式:author_detail = 對(duì)象

#author_detail = models.AuthorDetail.objects.create(addr='東京',phone='142111')

#author = models.Author.objects.create(name='lqz',age=20,author_detail=author_detail)

#修改

#修改-第一種方式

#author = models.Author.objects.filter(pk=1).update(author_detail_id = 3)

#修改-第二種方式

#author_detail = models.Author.objects.get(pk=3)

#author = models.Author.objects.filter(pk=1).update(author_detail = author_detail)

-一對(duì)多#一對(duì)多的新增

#publish = models.Publish.objects.create(name='南京出版社',email='sddd',phone=3333,addr='南京')

#book = models.Book.objects.create(name='紅樓夢(mèng)',publish_date='2018-01-01',price=100.33,publish_id=publish.pk)

-多對(duì)多#增加(給紅樓夢(mèng)這本書(shū) 添加兩個(gè)作者:lich lqz)

#book = models.Book.objects.filter(name='紅樓夢(mèng)').first()

#相當(dāng)于拿到第三張表,add內(nèi)可以傳入對(duì)象,也可以傳id

#book.authors.add(1,3) #傳id

#lich = models.Author.objects.get(pk=1)

#lqz = models.Author.objects.get(pk=3)

#book.authors.add(lich,lqz) #傳對(duì)象

4 表操作(查)---基于對(duì)象的跨表查詢:基于對(duì)象的查詢其實(shí)是子查詢(兩次查詢)#正向和反向

#正向: 關(guān)聯(lián)字段在當(dāng)前表中,從當(dāng)前表向外查,叫做正向

#反向: 關(guān)聯(lián)字段不在當(dāng)前表中,從當(dāng)前表向外查,叫做反向

#一對(duì)一查詢 ()

#查詢lich這個(gè)人的地址(正向查詢按字段,反向查詢表名小寫(xiě))

#author = models.Author.objects.filter(name='lich').first() # 先查找出這個(gè)對(duì)象

#print(author.author_detail) #需要在models類中,重寫(xiě)__str__(self)

#查詢地址為南京的作者人名(反向)

#author_detail = models.AuthorDetail.objects.filter(addr='南京').first()

#print(author_detail.author)

#一對(duì)多(正向) 出版社和書(shū) 關(guān)聯(lián)字段在書(shū)中

#正向查詢按字段,反向查詢按 表名小寫(xiě)_set.all()

#書(shū)~出版社:正向

#查詢紅樓夢(mèng)這本書(shū)的出版社地址

#book = models.Book.objects.filter(name='紅樓夢(mèng)').first()

#book.publish 就是出版社對(duì)象

#print(book.publish)

#print(book.publish.addr)

#出版社~書(shū):反向

#查詢南京出版社出版的所有書(shū)的名字

#publish = models.Publish.objects.filter(name='南京出版社').first()

#books = publish.book_set.all()

#print(books)

#for book in books:

#print(book.name)

#多對(duì)多,書(shū)和作者是多對(duì)多,關(guān)聯(lián)字段authors在book中

#總結(jié):正向查詢按字段.all() ,反向查詢按 表明小寫(xiě)_set.all()

#正向:book~author

#查詢紅樓夢(mèng)這本書(shū)的所有作者

#book = models.Book.objects.filter(name='紅樓夢(mèng)').first()

#authors = book.authors.all()

#print(authors)

#for author in authors:

#print(author.name)

#反向:author~book

#查詢作者是bbb的所有書(shū)

#author = models.Author.objects.filter(name='bbb').first()

#books = author.book_set.all()

#print(books)

#for book in books:

#print(book.name)

5 表操作(查)---基于雙下劃線的跨表查詢(連表查詢)#正向按 '基表關(guān)聯(lián)字段__第二張表的字段',反向按 '基表表名小寫(xiě)__第二張表的字段'

#一對(duì)一查詢

#查詢lich這個(gè)人的地址(以author表作為基表)

#ret = models.Author.objects.filter(name='lich').values('name','author_detail__addr')

#print(ret)

#查詢lich這個(gè)人的地址(以author_detail表作為基表)

#ret = models.AuthorDetail.objects.filter(author__name='lich').values('addr','author__name')

#print(ret)

#查詢地址為上海的人的名字

#ret = models.Author.objects.filter(author_detail__addr='上海').values('name','author_detail__addr')

#print(ret)

#ret = models.AuthorDetail.objects.filter(addr='上海').values('author__name','addr')

#print(ret)

#一對(duì)多查詢

#查詢紅樓夢(mèng)這本書(shū)的出版社

#ret = models.Book.objects.filter(name='紅樓夢(mèng)').values('publish__addr')

#print(ret.first())

#ret = models.Publish.objects.filter(name='南京出版社').values('addr','book__name')

#print(ret)

#查詢南京出版社出版所有書(shū)的名字

#ret = models.Publish.objects.filter(name='南京出版社').values('book__name')

#print(ret)

#ret = models.Book.objects.filter(publish__name='南京出版社').values('name')

#print(ret)

#多對(duì)多

#查詢紅樓夢(mèng)這本書(shū)的所有作者

#ret = models.Book.objects.filter(name='紅樓夢(mèng)').values('authors__name')

#print(ret)

#ret = models.Author.objects.filter(book__name='紅樓夢(mèng)').values('name')

#print(ret)

#查詢南京出版社出版過(guò)的所有書(shū)記的名字以及作者的姓名

#ret = models.Publish.objects.filter(name='南京出版社').values('book__name','book__authors__name')

#print(ret)

6 表操作(查) ---聚合查詢#計(jì)算所有圖書(shū)的平均價(jià)格

#from django.db.models import Count,Avg,Max,Min,Sum

#ret = models.Book.objects.all().aggregate(Avg('price')) #平均價(jià)格

#ret = models.Book.objects.all().aggregate(Max('price')) #最高價(jià)格...

#ret = models.Book.objects.all().aggregate(Count('price')) #書(shū)本數(shù)量

#ret = models.Book.objects.all().aggregate(Sum('price')) #書(shū)本數(shù)量

#print(ret)

7 表操作(查)--- F/Q查詢#F取出表中字段對(duì)應(yīng)的值

#查詢?cè)u(píng)論數(shù)大于閱讀數(shù)的書(shū)

from django.db.models importFfrom django.db.models importQ#ret = models.Book.objects.filter(comment_num__gt=F('read_num'))

#ret = models.Book.objects.filter(comment_num__lt=F('read_num'))

#print(ret)

#把所有書(shū)的評(píng)論數(shù)+1

#ret = models.Book.objects.all().update(comment_num = F('comment_num')+1)

#Q查詢,構(gòu)造出 與(&) 、 或(|) 、 非(~)的關(guān)系

#ret = models.Book.objects.filter(name='紅樓夢(mèng)',price=100)

#print(ret)

#ret = models.Book.objects.filter(Q(name='西游記')|Q(price='12.11')) # 或 有點(diǎn)疑問(wèn)

#ret = models.Book.objects.filter(Q(name='紅樓夢(mèng)')&Q(price=100)) #不如,并且關(guān)系來(lái)的簡(jiǎn)單 #與 有點(diǎn)問(wèn)題

#ret = models.Book.objects.filter(~Q(name='西游記')) # 非

#print(ret)

-圖書(shū)管理系統(tǒng)表1book表2publish表3author表4author_detail表

表關(guān)系-author表和author_detail表是一對(duì)一的關(guān)系-book表和publish表:一本書(shū)只能有一個(gè)出版社出版,一對(duì)多的關(guān)系一旦確立,關(guān)聯(lián)字段寫(xiě)在多的一方-book表和author表:多對(duì)多的關(guān)系,需要?jiǎng)?chuàng)建第三張表**** 關(guān)聯(lián)關(guān)系 ****:

一對(duì)一的關(guān)系,關(guān)聯(lián)字段寫(xiě)在哪都行

一對(duì)多的關(guān)系,關(guān)聯(lián)字段寫(xiě)在多的一方

多對(duì)多的關(guān)系,需要?jiǎng)?chuàng)建第三張表

重點(diǎn):1 author_detail = models.OneToOneField(to='AuthorDetail',to_field='id') #本質(zhì)就是foregnkey+唯一性約束

2 publish = models.ForeignKey(to='Publish') #ForeignKey對(duì)應(yīng)的字段,同步到數(shù)據(jù)庫(kù),會(huì)自動(dòng)加_id

3 authors = models.ManyToManyField(to='Author') #自動(dòng)創(chuàng)建第三張表

總結(jié)

以上是生活随笔為你收集整理的python框架django入门_web框架之Django(python3入门)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。