python框架django入门_web框架之Django(python3入门)
-ORM
ORM是什么?
不是django獨有或者python獨有的
對象關(guān)系映射
python中主流的幾個ORM框架
django的orm(django已經(jīng)封裝好了,必須在django中使用)
sqlAchemy 第三方的orm框架(這個可以單獨拿出來使用)---Flask框架并沒有orm,會用到sqlAchemy
自己寫
orm不能創(chuàng)建數(shù)據(jù)庫,只能創(chuàng)建表,刪除表,新增字段,刪除字段
通過orm創(chuàng)建user表
第一步 在settings.py配置
DATABASES={'ENGINE':'django.db.backends.mysql','NAME':'數(shù)據(jù)庫名字','HOST':'mysql IP','PORT':3306,'USER':'數(shù)據(jù)庫用戶名','PASSWORD':'數(shù)據(jù)庫密碼'}
第二步 鏈接數(shù)據(jù)庫,操作數(shù)據(jù)庫的模塊(pymysql)- mysqlDB 只能python 2.x用(django內(nèi)置這個模塊)-pymysql python2.x 和3.x 都可以用-所以需要在__init__.py下寫一行代碼(一般情況 寫在app下面的__init__中)importpymysql#讓pymysql替換掉原來django中內(nèi)置的mysqldb的地方,以后操作mysql,就用pymysql這個模塊
pymysql.install_as_MySQLdb()
第三步 創(chuàng)建一個表(在models.py中創(chuàng)建新表)#創(chuàng)建一個user表,在orm中,其實就是寫一個類
classUser(models.Model):#在這個類中,寫入需要創(chuàng)建的字段
#id字段,自增,int類型,是主鍵
id = models.AutoField(primary_key=True)#name字段,varchar類型 ,長度32
name = models.CharField(max_length=32)#pwd字段,varchar類型 ,長度32,可以為空
pwd = models.CharField(max_length=32, null=True)
第四步:
把新建表同步到數(shù)據(jù)庫,django項目中的migrations文件夾存放數(shù)據(jù)庫遷移的記錄
按次序執(zhí)行下面兩條指令:
python3 manage.py makemigrations#數(shù)據(jù)表變化的記錄
python3 manage.py migrate #數(shù)據(jù)庫同步命令(數(shù)據(jù)庫的表就會發(fā)生變化)
-通過orm創(chuàng)建user表
通過上面的四個步驟,就可以創(chuàng)建出user表
新增表、刪除表、新增字段、刪除字段--- 一個class就是一張表,刪除=注釋代碼+執(zhí)行兩條命令,新增=新增字段代碼+執(zhí)行兩條命令classUser(models.Model):#在這個類中,寫入需要創(chuàng)建的字段
#id字段,自增,int類型,是主鍵
id = models.AutoField(primary_key=True)#name字段,varchar類型 ,長度32
name = models.CharField(max_length=32)#pwd字段,varchar類型 ,長度32,可以為空
pwd = models.CharField(max_length=32, null=True)#增加字段
xx = models.CharField(max_length=64)## 再增加個字段
#yy = models.CharField(max_length=64, null=True)
# ## 再增加一個字段
#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單表的增刪改查#為了驗證測試方便,寫了這個腳本 用來驗證orm 數(shù)據(jù)增刪改查
importosif __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ORM_Proj.settings')importdjango
django.setup()from app01 importmodels
(緊接著 上面的腳本寫下去)#新增用戶
#方式一,通過對象來保存數(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對象,內(nèi)部套了一個個的對象(理解為是一個列表)
#查詢名字為lich的數(shù)據(jù)
#ret = models.User.objects.filter(username='lich').first() #結(jié)果是User對象,取出查詢結(jié)果中的第一條數(shù)據(jù)
#ret = models.User.objects.filter(username='lich')
#print(ret)
#刪除的第一種方式: 把id=1的人刪除(先查詢后刪除)
#ret = models.User.objects.filter(id=1).delete() #把查詢出來的所有結(jié)果刪除
#print(ret)
#刪除的第二種方式:刪除id=6的這個人(查詢出對象,刪除對象)
#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') #所有查詢出來的數(shù)據(jù)都更新
#print(ret) #ret是影響的行數(shù)
#修改數(shù)據(jù)的第二種方式:
user = models.User.objects.filter(id=5).first()
user.username= 'xxx'
#沒有user.update()
user.save() #既可以保存 又可以更新
print(user.username)2單表的其他操作### 單表的其他操作
#<1> all()返回queryset對象,查詢表中所有記錄
#ret = models.User.objects.all() #把它當(dāng)成queryset對象
#print(ret)
#<2> filter(**kwargs)返回queryset對象, 這種形式是'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對象
#get查詢的結(jié)果有且只有一個值才行,否則程序會報錯
#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()計算查詢結(jié)果的總條目數(shù)
#ret = models.User.objects.all().count()
#ret = models.User.objects.filter(username='a').first()
#print(ret)
#exists()查詢queryset對象的結(jié)果是否為空,返回的結(jié)果是true或false
#ret = models.User.objects.filter(id=10).exists()
#ret = models.User.objects.filter(id=8).exists()
#print(ret)
#values() 返回一個valueQueryset,運行后得到一個可迭代的字典序列
#ret = models.User.objects.all().values('username','passwd')
#print(ret)
#print(ret.first())
#values_list() 直接將取到的結(jié)果 組成一個元組
#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開頭
#ret = models.User.objects.filter(username__startswith='l')
#print(ret)
#contains 包含xx
ret = models.User.objects.filter(username__contains='i') #嚴(yán)格大小寫包含
ret = models.User.objects.filter(username__icontains='i') #忽略大小寫包含
print(ret)3表操作(增刪改)-一對一#一對一新增(注意所在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 = 對象
#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)
-一對多#一對多的新增
#publish = models.Publish.objects.create(name='南京出版社',email='sddd',phone=3333,addr='南京')
#book = models.Book.objects.create(name='紅樓夢',publish_date='2018-01-01',price=100.33,publish_id=publish.pk)
-多對多#增加(給紅樓夢這本書 添加兩個作者:lich lqz)
#book = models.Book.objects.filter(name='紅樓夢').first()
#相當(dāng)于拿到第三張表,add內(nèi)可以傳入對象,也可以傳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) #傳對象
4 表操作(查)---基于對象的跨表查詢:基于對象的查詢其實是子查詢(兩次查詢)#正向和反向
#正向: 關(guān)聯(lián)字段在當(dāng)前表中,從當(dāng)前表向外查,叫做正向
#反向: 關(guān)聯(lián)字段不在當(dāng)前表中,從當(dāng)前表向外查,叫做反向
#一對一查詢 ()
#查詢lich這個人的地址(正向查詢按字段,反向查詢表名小寫)
#author = models.Author.objects.filter(name='lich').first() # 先查找出這個對象
#print(author.author_detail) #需要在models類中,重寫__str__(self)
#查詢地址為南京的作者人名(反向)
#author_detail = models.AuthorDetail.objects.filter(addr='南京').first()
#print(author_detail.author)
#一對多(正向) 出版社和書 關(guān)聯(lián)字段在書中
#正向查詢按字段,反向查詢按 表名小寫_set.all()
#書~出版社:正向
#查詢紅樓夢這本書的出版社地址
#book = models.Book.objects.filter(name='紅樓夢').first()
#book.publish 就是出版社對象
#print(book.publish)
#print(book.publish.addr)
#出版社~書:反向
#查詢南京出版社出版的所有書的名字
#publish = models.Publish.objects.filter(name='南京出版社').first()
#books = publish.book_set.all()
#print(books)
#for book in books:
#print(book.name)
#多對多,書和作者是多對多,關(guān)聯(lián)字段authors在book中
#總結(jié):正向查詢按字段.all() ,反向查詢按 表明小寫_set.all()
#正向:book~author
#查詢紅樓夢這本書的所有作者
#book = models.Book.objects.filter(name='紅樓夢').first()
#authors = book.authors.all()
#print(authors)
#for author in authors:
#print(author.name)
#反向:author~book
#查詢作者是bbb的所有書
#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)字段__第二張表的字段',反向按 '基表表名小寫__第二張表的字段'
#一對一查詢
#查詢lich這個人的地址(以author表作為基表)
#ret = models.Author.objects.filter(name='lich').values('name','author_detail__addr')
#print(ret)
#查詢lich這個人的地址(以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)
#一對多查詢
#查詢紅樓夢這本書的出版社
#ret = models.Book.objects.filter(name='紅樓夢').values('publish__addr')
#print(ret.first())
#ret = models.Publish.objects.filter(name='南京出版社').values('addr','book__name')
#print(ret)
#查詢南京出版社出版所有書的名字
#ret = models.Publish.objects.filter(name='南京出版社').values('book__name')
#print(ret)
#ret = models.Book.objects.filter(publish__name='南京出版社').values('name')
#print(ret)
#多對多
#查詢紅樓夢這本書的所有作者
#ret = models.Book.objects.filter(name='紅樓夢').values('authors__name')
#print(ret)
#ret = models.Author.objects.filter(book__name='紅樓夢').values('name')
#print(ret)
#查詢南京出版社出版過的所有書記的名字以及作者的姓名
#ret = models.Publish.objects.filter(name='南京出版社').values('book__name','book__authors__name')
#print(ret)
6 表操作(查) ---聚合查詢#計算所有圖書的平均價格
#from django.db.models import Count,Avg,Max,Min,Sum
#ret = models.Book.objects.all().aggregate(Avg('price')) #平均價格
#ret = models.Book.objects.all().aggregate(Max('price')) #最高價格...
#ret = models.Book.objects.all().aggregate(Count('price')) #書本數(shù)量
#ret = models.Book.objects.all().aggregate(Sum('price')) #書本數(shù)量
#print(ret)
7 表操作(查)--- F/Q查詢#F取出表中字段對應(yīng)的值
#查詢評論數(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ù)+1
#ret = models.Book.objects.all().update(comment_num = F('comment_num')+1)
#Q查詢,構(gòu)造出 與(&) 、 或(|) 、 非(~)的關(guān)系
#ret = models.Book.objects.filter(name='紅樓夢',price=100)
#print(ret)
#ret = models.Book.objects.filter(Q(name='西游記')|Q(price='12.11')) # 或 有點疑問
#ret = models.Book.objects.filter(Q(name='紅樓夢')&Q(price=100)) #不如,并且關(guān)系來的簡單 #與 有點問題
#ret = models.Book.objects.filter(~Q(name='西游記')) # 非
#print(ret)
-圖書管理系統(tǒng)表1book表2publish表3author表4author_detail表
表關(guān)系-author表和author_detail表是一對一的關(guān)系-book表和publish表:一本書只能有一個出版社出版,一對多的關(guān)系一旦確立,關(guān)聯(lián)字段寫在多的一方-book表和author表:多對多的關(guān)系,需要創(chuàng)建第三張表**** 關(guān)聯(lián)關(guān)系 ****:
一對一的關(guān)系,關(guān)聯(lián)字段寫在哪都行
一對多的關(guān)系,關(guān)聯(lián)字段寫在多的一方
多對多的關(guān)系,需要創(chuàng)建第三張表
重點:1 author_detail = models.OneToOneField(to='AuthorDetail',to_field='id') #本質(zhì)就是foregnkey+唯一性約束
2 publish = models.ForeignKey(to='Publish') #ForeignKey對應(yīng)的字段,同步到數(shù)據(jù)庫,會自動加_id
3 authors = models.ManyToManyField(to='Author') #自動創(chuàng)建第三張表
總結(jié)
以上是生活随笔為你收集整理的python框架django入门_web框架之Django(python3入门)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星新款玄龙骑士显示器 Ark 迎折扣:
- 下一篇: u盘无法复制文件进去_U盘无法复制超过4