BookBuypro 图书购买案例
1.创建数据模型
models.py
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注册(注册数据模型到管理模块)
admin.py
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),
]