django-学习路程之案例(一)

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



]






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值