django-學習路程之案例(一)
阿新 • • 發佈:2018-12-11
BookBuypro 圖書購買案例
1.建立資料模型
from datetime import datetime from django.db import models # Create your models here. ###################################################### 使用者部分 # 建立使用者資料模型 class Users(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() sex = models.BooleanField(default=True) # 建立使用者詳細資訊 class UserInfos(models.Model): addr = models.CharField(max_length=100) isVip = models.BooleanField(default=True) tel = models.BigIntegerField() fUser= models.OneToOneField(Users,on_delete=models.CASCADE,default=1) # 使用者買書會員卡 class Card(models.Model): num = models.IntegerField(primary_key=True) money = models.FloatField() level = models.IntegerField() fUser = models.OneToOneField(Users,on_delete=models.CASCADE,default=1) ###################################################### 書籍部分 # 創建出版社資料模型 class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=100) tel = models.BigIntegerField(default=1060) # 建立作者資料模型 class Authors(models.Model): name = models.CharField(max_length=32) age = models.SmallIntegerField() addr = models.CharField(max_length=50) # 建立書籍資料模型 class Books(models.Model): name = models.CharField(max_length=32) price = models.FloatField() # 書籍剩餘數量 count = models.IntegerField() # 作為購買者user的從表 建立多表之間的關係 fUser = models.ManyToManyField(Users) # 是否正在銷售中 isSale = models.BooleanField(default=True) # 作者Author 與 Books 是一對多的關係 fAuthor = models.ForeignKey(Authors,on_delete=models.DO_NOTHING,default=1) # 圖書與出版社 的 表一對多關係 fPublish = models.ForeignKey(Publish,on_delete=models.DO_NOTHING,default=1) # 建立書籍簡介資料模型 class BookInfos(models.Model): intrduction = models.TextField() type = models.CharField(max_length=32) bDate = models.DateTimeField(default=datetime.now()) # 圖書資訊與圖書 是一對一的關係 fBook = models.OneToOneField(Books,on_delete=models.CASCADE,default=1)
2.資料遷移
python manage.py makemigrations
python manage.py migrate
3.admin註冊(註冊資料模型到管理模組)
from django.contrib import admin from .models import * # Register your models here. # 為所有資料表模型進行註冊 admin.site.register(Users) admin.site.register(UserInfos) admin.site.register(Card) admin.site.register(Books) admin.site.register(Publish) admin.site.register(BookInfos) admin.site.register(Authors)
4.檢視函式實現多表操作功能需求
from django.shortcuts import render,HttpResponse from .models import * # Create your views here. ##################################################### 新增 使用者部分 def addUser(request,name,age,sex): user = Users() user.name = name user.age = age if sex == 0: user.sex = True if sex == 1: user.sex = False user.save() return HttpResponse('新增使用者 ' + user.name + ' 成功!') def addUserInfos(request,addr,isVip,tel,uId): info = UserInfos() info.addr = addr if isVip == 1: info.isVip = True if isVip == 0: info.isVip = False info.tel = tel user = Users.objects.get(pk=uId) info.fUser = user info.save() return HttpResponse('新增使用者 ' + user.name + ' 使用者資訊成功!') def addCard(request,num,money,level,uId): card = Card() # 新增會員卡ID 並設定外來鍵繫結使用者表內元素 card.num = num # 新增會員卡餘額 card.money = money card.level = level user = Users.objects.get(pk=uId) card.fUser = user card.save() return HttpResponse('新增使用者 ' + user.name + ' 會員卡資訊成功!') ############################################################# 新增圖書部分 def addPulish(request,name,addr,tel): publish = Publish() # 添加出版社名 publish.name = name # 添加出版社地址 publish.addr = addr # 添加出版社電話號碼 publish.tel = tel publish.save() return HttpResponse('註冊出版社 ' + publish.name + ' 成功!') # 新增作者資訊 def addAuthor(request,name,age,addr): author = Authors() author.name = name author.age = age author.addr = addr author.save() return HttpResponse('新增作者 ' + author.name + ' 資訊成功!') # 新增圖書資訊 def addBooks(request,name,price,count,isSale,aId,pId): book = Books() book.name = name book.price = price # 新增圖書剩餘數量 book.count = count # 新增圖書是否在售 if isSale == 1: book.isSale = True if isSale == 0: book.isSale = False # 在新增書籍資訊的時候繫結作者id aId 指明這本書是誰寫的 author = Authors.objects.get(pk=aId) book.fAuthor = author # 在新增書籍資訊的時候綁定出版社pId 指明這本書是哪個出版社出版的 publish = Publish.objects.get(pk=pId) book.fPublish = publish book.save() return HttpResponse('圖書--> ' + book.name + ' 資訊新增成功!') # 新增圖書具體資訊 def addBookInfo(request,intrduction,type,bDate,bId): info = BookInfos() # 新增圖書簡介 info.intrduction = intrduction # 新增圖書型別 info.type = type # 新增圖書出版日期 info.bDate = bDate # 在新增圖書具體資訊時新增外來鍵資訊繫結圖書 指明這個圖書簡介是那本圖書的 book = Books.objects.get(pk=bId) info.fBook = book info.save() return HttpResponse('新增名為: ' + book.name + ' 的圖書具體資訊成功!') ################################################## 刪除 使用者部分 def delUser(request,uId): user = Users.objects.get(pk=uId) user.delete() return HttpResponse('刪除使用者 ' + user.name +'成功!') def delUserInfo(request,uiId): userinfo = UserInfos.objects.get(pk=uiId) userinfo.delete() return HttpResponse('刪除使用者 ' + userinfo.fUser.name + ' 資訊成功!') def delCard(request,cardId): card = Card.objects.get(pk=cardId) card.delete() return HttpResponse('刪除使用者 ' + card.fUser.name + ' 會員卡成功!') ################################################## 刪除 圖書部分 def delPublish(request,pId): publish = Publish.objects.get(pk=pId) publish.delete() return HttpResponse('出版社 ' + publish.name + ' 刪除成功!') def delAuthor(request,aId): author = Authors.objects.get(pk=aId) author.delete() return HttpResponse('作者 ' + author.name + ' 刪除成功!') def delBook(request,bId): book = Books.objects.get(pk=bId) book.delete() return HttpResponse('書籍 ' + book.name + ' 刪除成功!') def delBookInfo(request,biId): bookinfo = BookInfos.objects.get(pk=biId) bookinfo.delete() return HttpResponse('書籍 ' + BookInfos.fBook.name + ' 詳細資訊刪除成功!') ################################################## 更改 使用者部分 def modifyUser(request,uId,name,age,sex): user = Users.objects.get(pk=uId) # 更改使用者資訊 if name == '000': pass else: user.name = name if age == 000: pass else: user.age = age if sex == 000: pass else: user.sex = sex user.save() return HttpResponse('更改 ' + user.name + ' 資訊成功!') # 構造更改使用者詳細資訊方法 def modifyUserInfo(request,uiId,addr,isVip,tel): userinfo = UserInfos.objects.get(pk=uiId) # 更改使用者詳細資訊 if addr == '000': pass else: userinfo.addr = addr if isVip == 000: pass else: userinfo.isVip = isVip if tel == 000: pass else: userinfo.tel = tel userinfo.save() return HttpResponse('使用者 ' + userinfo.fUser.name + ' 詳細資訊更改成功!') def modifyCard(request,cardId,uId,level): card = Card.objects.get(pk=cardId) # 更改使用者會員卡資訊 user = Users.objects.get(pk=uId) if uId == 000: pass # 如果更改則將會員卡繫結到輸入uId的使用者上 elif user.card.fUser_id is not None: print('該使用者已有繫結的會員卡!') # 如果uId 匹配的使用者沒有會員卡繫結 則將cardId 匹配的會員卡繫結到該使用者上 else: card.fUser = user # 如果level 值為0 則不更改資訊 if level == 000: pass else: card.level = level card.save() return HttpResponse('使用者 ' + card.fUser.name + ' 會員卡資訊更改成功!') ##################################################### 更改 圖書部分 def modifyPublish(request,pId,name,addr,tel): publish = Publish.objects.get(pk=pId) if name == '000': pass else: publish.name = name if addr == '000': pass else: publish.addr = addr if tel == 000: pass else: publish.tel = tel publish.save() return HttpResponse('出版社 ' + publish.name + ' 資訊更改成功!') def modifyAuthor(request,aId,name,age,addr): author = Authors.objects.get(pk=aId) # 更改作者資訊 if name == '000': pass else: author.name = name if age == 000: pass else: author.age = age if addr == '000': pass else: author.addr = addr author.save() return HttpResponse('作者 ' + author.name + ' 資訊更改成功!') def modifyBook(request,bId,name,price,count,isSale): book = Books.objects.get(pk=bId) # 更改書籍資訊 if name == '000': pass else: book.name = name if price == 000: pass else: book.price = price if count == 000: pass else: book.count = count if isSale == 000: pass else: book.isSale = isSale book.save() return HttpResponse('書籍 ' + book.name + ' 資訊修改成功!') def modifyBookInfo(request,biId,intrduction,type,bDate): bookinfo = BookInfos.objects.get(pk=biId) # 更改書籍詳細資訊 if intrduction == '000': pass else: bookinfo.intrduction = intrduction if type == '000': pass else: bookinfo.type = type if bDate == '000': pass else: bookinfo.bDate = bDate bookinfo.save() return HttpResponse('書籍 ' + bookinfo.fBook.name + ' 詳細資訊修改成功!') ################################################### 查詢 使用者資訊部分 # 查詢使用者資訊 def getUserByUserInfo(request,uiId): userinfo = UserInfos.objects.get(pk=uiId) return HttpResponse('使用者詳細資訊id為 ' + str(uiId) + ' 的使用者名稱為: ' + userinfo.fUser.name) def getUserInfoByUser(request,uId): user = Users.objects.get(pk=uId) return HttpResponse('使用者id為 ' + str(uId) + ' 的使用者詳細資訊為 ' + ' --使用者地址: ' + user.userinfos.addr + ' -- ' + ' \n--使用者是否是會員 ' + str(user.userinfos.isVip) + ' \n--使用者電話號碼: ' + str(user.userinfos.tel)) def getCardByUser(request,uId): user = Users.objects.get(pk=uId) return HttpResponse('id為 ' + str(uId) + ' 的使用者的會員卡資訊如下: \n' + '--卡號: ' + str(user.card.num) + '\n--餘額: ' + str(user.card.money) + '\n--會員等級: ' + str(user.card.level)) def getUserByCard(request,cardId): card = Card.objects.get(pk=cardId) return HttpResponse('會員卡號為 ' + str(cardId) + ' 的使用者名稱為: ' + card.fUser.name) ################################################### 查詢 圖書資訊部分 # 查詢出版社資訊 def getPublishByBook(request,bId): book = Books.objects.get(pk=bId) return HttpResponse('id為 ' + str(bId) + ' 的書籍的出版社為: ' + book.fPublish.name) def getBookByPublish(request,pId): publish = Publish.objects.get(pk=pId) str = '' for book in publish.books_set.all(): str += book.name str += ', ' return HttpResponse(publish.name + ' 出版的書籍有: ' + str) # 查詢作者資訊 def getAuthorByBook(request,bId): book = Books.objects.get(pk=bId) return HttpResponse(book.name + ' 的作者是: ' + book.fAuthor.name) def getBookByAuthor(request,aId): author = Authors.objects.get(pk=aId) str = '' for book in author.books_set.all(): str += book.name str += ', ' return HttpResponse(author.name + ' 的作品有:' + str ) # 查詢書籍資訊 def getBookByBookInfo(request,biId): bookinfo = BookInfos.objects.get(pk=biId) return HttpResponse(bookinfo.intrduction + ' 形容的是: ' + bookinfo.fBook.name) def getBookInfoByBook(request,bId): book = Books.objects.get(pk=bId) return HttpResponse(book.name + ' 的詳細資訊如下:\n' + '--簡介: ' + book.bookinfos.intrduction + '\n--型別:' + book.bookinfos.type + '\n--創作時間: ' + str(book.bookinfos.bDate)) ############################################################# 購買操作 # 使用者購買書籍 def UserBuyBook(request,uId,bId): user = Users.objects.get(pk=uId) book = Books.objects.get(pk=bId) mon = user.card.money - book.price # 圖書外來鍵對應的客戶是一個集合 if user.card.money == 0: return HttpResponse('您的餘額不足,不能購買此圖書!') elif mon < 0: return HttpResponse('您的餘額不足以扣除本次支付,請充值^_^!') else: if book.count <= 0: return HttpResponse('圖書存量不足!') else: book.count -= 1 user.card.money -= book.price book.fUser.add(user) # 將使用者資訊更改儲存 user.card.save() book.save() return HttpResponse('恭喜您購買成功! ' + '\n您購得的書籍 ' + book.name + ' 已經成功扣款 ' + str(book.price) + ' 歡迎下次光臨^_^!' + '\n圖書價格: ' + str(book.price) + '---- 您的餘額: ' + str(user.card.money)) ############################################################## 購買查詢 # 查詢指定使用者買了哪些書 def getBooksByUser(request,uId): user = Books.objects.get(pk=uId) str = '' for book in user.books_set.all(): str += book.name str += ', ' return HttpResponse('使用者--> ' + user.name + ' 購買過的書籍如下:\n ' + str) # 查詢指定書籍被哪些使用者購買過 def getUserByBooks(request,bId): book = Books.objects.get(pk=bId) str = '' for user in book.fUser.all(): str += user.name str += ', ' return HttpResponse('購買過 ' + book.name + ' 的使用者有:\n ' + str)
5.路徑配置
from django.contrib import admin
from django.urls import path
from .views import *
urlpatterns = [
path('admin/',admin.site.urls),
###################################################### 新增
# 新增使用者資訊
path('add/addUser/<str:name>/<int:age>/<int:sex>/',addUser),
# 新增使用者詳細資訊
path('add/addUserInfos/<str:addr>/<int:isVip>/<int:tel>/<int:uId>/',addUserInfos),
# 新增會員卡資訊
path('add/addCard/<int:num>/<int:money>/<int:level>/<int:uId>/',addCard),
# 添加出版社資訊
path('add/addPublish/<str:name>/<str:addr>/<int:tel>/',addPulish),
# 新增作者資訊
path('add/addAuthor/<str:name>/<int:age>/<str:addr>/',addAuthor),
# 新增圖書資訊
path('add/addBooks/<str:name>/<int:price>/<int:count>/<int:isSale>/<int:aId>/<int:pId>/',addBooks),
# 新增圖書詳細資訊
path('add/addBookInfo/<str:intrduction>/<str:type>/<str:bDate>/<int:bId>/',addBookInfo),
##################################################### 刪除
# 刪除使用者
path('delete/delUser/<int:uId>/',delUser),
# 刪除使用者詳細資訊
path('delete/delUserInfo/<int:uiId>/',delUserInfo),
# 刪除使用者會員卡資訊
path('delete/delCard/<int:cardId>/',delCard),
# 刪除出版社資訊
path('delete/delPublish/<int:pId>/',delPublish),
# 刪除作者資訊
path('delete/delAuthor/<int:aId>/',delAuthor),
# 刪除書籍資訊
path('delete/delBook/<int:bId>/',delBook),
# 刪除書籍詳細資訊
path('delete/delBookInfo/<int:biId>/',delBookInfo),
##################################################### 更改
# 更改使用者資訊
path('modify/modifyUser/<int:uId>/<str:name>/<int:age>/<int:sex>/',modifyUser),
# 更改使用者詳細資訊
path('modify/modifyUserInfo/<int:uiId>/<str:addr>/<int:isVip>/<int:tel>/',modifyUserInfo),
# 更改使用者會員卡資訊
path('modify/modifyCard/<int:cardId>/<int:uId>/<int:level>/',modifyCard),
# 更改出版社資訊
path('modify/modifyPublish/<int:pId>/<str:name>/<str:addr>/<int:tel>/',modifyPublish),
# 更改作者資訊
path('modify/modifyAuthor/<int:aId>/<str:name>/<int:age>/<str:addr>/',modifyAuthor),
# 更改書籍資訊
path('modify/modifyBook/<int:bId>/<str:name>/<int:price>/<int:count>/<int:isSale>/',modifyBook),
# 更改書籍詳細資訊
path('modify/modifyBookInfo/<int:biId>/<str:intrduction>/<str:type>/<str:bDate>',modifyBookInfo),
########################################################## 查詢
# 通過使用者詳細資訊查詢使用者名稱
path('select/getUserByUserInfo/<int:uiId>/',getUserByUserInfo),
# 通過使用者名稱查詢使用者詳細資訊
path('select/getUserInfoByUser/<int:uId>/',getUserInfoByUser),
# 通過使用者id查詢使用者會員卡資訊
path('select/getCardByUser/<int:uId>/',getCardByUser),
# 通過使用者會員卡資訊查詢使用者名稱
path('select/getUserByCard/<int:cardId>/',getUserByCard),
# 通過書籍id查詢出版社資訊
path('select/getPublishByBook/<int:bId>/',getPublishByBook),
# 通過出版社查詢所有出版的書籍
path('select/getBookByPublish/<int:pId>/',getBookByPublish),
# 通過書籍查詢作者
path('select/getAuthorByBook/<int:bId>/',getAuthorByBook),
# 通過作者查詢其作品
path('select/getBookByAuthor/<int:aId>/',getBookByAuthor),
# 通過書籍簡介查詢書籍資訊
path('select/getBookByBookInfo/<int:biId>/',getBookByBookInfo),
# 通過書籍查詢其詳細資訊
path('select/getBookInfoByBook/<int:bId>/',getBookInfoByBook),
############################################################### 使用者書籍購買操作
# 使用者購買圖書操作
path('UbuyB/UserBuyBook/<int:uId>/<int:bId>/',UserBuyBook),
############################################################# 使用者書籍購買查詢
# 查詢指定使用者購買了哪些圖書
path('select/getBooksByUser/<int:uId>/',getBooksByUser),
# 查詢指定圖書被哪些使用者購買過
path('select/getUserByBooks/<int:bId>/',getUserByBooks),
]