1. 程式人生 > >django-學習路程之案例(一)

django-學習路程之案例(一)

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),



]