赞
踩
当前文件的上一级的上一级绝对路径:/root/PycharmProjects/bookmanage
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
在settings.py文件中添加一行
# 告知系统静态文件的路径
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
from django.apps import AppConfig
class BookConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'book'
# 改变管理平台中的标题
verbose_name = '后台相关'
在设置外键时 ,需要通过on_delete选项指明主表删除数据是时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
class BookInfo(models.Model): # 属性名 = 属性类型(选项) name = models.CharField(max_length=10,unique=True,verbose_name='名字') # 发布日期 pub_date = models.DateField(null=True) # 阅读量 readcount = models.IntegerField(default=0) # 评论量 commentcount = models.IntegerField(default=0) # 是否逻辑删除 is_delete = models.BooleanField(default=False) class Meta: # 设置生成的表的名称 固定形式 db_table = 'bookinfo' # 修改后台admin的显示信息的配置 verbose_name = 'admin' def __str__(self): return self.name class PeopleInfo(models.Model): # 有序字典 GENDER_CHOICES = ( (0,'male'), (1,'female') ) name = models.CharField(max_length=20,verbose_name='名称') gender = models.SmallIntegerField(choices=GENDER_CHOICES,default=0,verbose_name='性别') description = models.CharField(max_length=200,null=True,verbose_name='描述') # 设置外键 # on_delete:CASCADE级联,删除主表 数据时连同一起删除外键中的数据 book = models.ForeignKey(BookInfo,on_delete=models.CASCADE,verbose_name='书') is_delete = models.BooleanField(default=False,verbose_name='逻辑删除') class Meta: db_table = 'peopleinfo' verbose_name = '人物信息' def __str__(self): return self.name
pip3 install PyMySQL
作用是让Django的ORM能以mysqldb的方式来调用PyMySQL
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'HOST':'localhost', # 主机
'PORT':'3306',# 端口
'USER':'root',# 用户名
'PASSWORD':'123456',# 密码
'NAME': 'bookmanage_db',# 指定数据库
}
}
再进行模型迁移
运行shell
python3 manage.py shell
##############################新增数据###############################
from book.models import BookInfo
# 方式一
book = BookInfo(
name= 'python',
pub_date='2000-01-01'
)
# 需要手动调用save方法
book.save()
# 方式二
# 使用模型的管理类objects,对模型进行增删改查
BookInfo.objects.create(
name= 'java',
pub_date='2001-01-01')
##############################修改/更新数据###############################
from book.models import BookInfo
# 方式一
# 1.先查询数据 select * from bookinfo where id =1
book = BookInfo.objects.get(id = 1)
# 2.直接修改实例的属性
book.readcount = 20
# 3.调用save()
book.save()
# 方式二 直接更新
BookInfo.objects.filter(id = 1).update(readcount = 100, commentcount = 200 )
##############################删除数据###############################
# 方式一
# 1.先查询出来数据
book = BookInfo.objects.get(id = 5)
# 2.直接调用delete方法
book.delete()
# 方式二
BookInfo.objects.filter( id = 6).delete()
##############################查询数据############################### # get 得到单一对象 # all 获取所有的数据 列表 # count 获取个数 # select * from bookinfo where id = 1 # 返回一个对象 book = BookInfo.objects.get(id = 1) # book.name # book.readcount # 查询id不存在的数据会抛出异常 ''' book.models.BookInfo.DoesNotExist: BookInfo matching query does not exist. ''' book1 = BookInfo.objects.get(id = 100) # 处理异常 try: book = BookInfo.objects.get(id = 2) # except Exception: # pass # 排除具体的异常 except BookInfo.DoesNotExist: pass # 返回一个列表 # <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]> book2 = BookInfo.objects.all() book3 = BookInfo.objects.count()
##############################filter,get,exclude############################### ''' 相当于where查询 filter : 筛选/过滤 返回n个结果 (n = 0/1/n) get : 返回1个结果 exclude : 排除掉符合条件剩下的结果 相当于not 语法形式: filter/get/exclude(字段名__运算符 = 值) ''' # 查询编号为1的图书 # exact 精确的,准确的等于 # get 得到的是一个对象:<BookInfo: 射雕英雄传> BookInfo.objects.get(id__exact = 1) BookInfo.objects.get(id = 1) # filter 得到的是一个列表:<QuerySet [<BookInfo: 射雕英雄传>]> # 可通过BookInfo.objects.filter(id = 1)[0]的方式取值 BookInfo.objects.filter(id = 1) BookInfo.objects.filter(id__exact = 1) # 查询书名包含’湖‘的图书 BookInfo.objects.filter(name__contains='湖') # 查询书名以’部‘结尾的图书 BookInfo.objects.filter(name__endswith='部') # 查询书名为空的图书 BookInfo.objects.filter(name__isnull= True) # 查询编号为1或3或5的图书 BookInfo.objects.filter(id__in = [1,3,5]) # 查询编号大于3的图书 # gt : 大于 great # gte : 大于等于 equel 等于 # lt : less than BookInfo.objects.filter(id__gt = 3) # 查询编号不为3的图书 BookInfo.objects.exclude(id__exact = 3) BookInfo.objects.exclude(id =3) # 查询1980年发表的图书 BookInfo.objects.filter(pub_date__year='1980') # 查询1990年1月1日后发表的图书 BookInfo.objects.filter(pub_date__gt= '1990-1-1')
##############################F对象###############################
'''
之前的查询都是对象的属性与常量值比较,两个属性比较时,使用F对象,被定义在django.db.models中
语法格式:filter(字段名__运算符=F('字段名'))
'''
from django.db.models import F
# 查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))
# 查询阅读量大于2倍评论量的图书
BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
##############################Q对象############################### # 查询id大于2,并且阅读量大于20的书籍 # 方式一 filter().filter() BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20) # 方式二 filter(条件,条件) BookInfo.objects.filter(id__gt=2,readcount__gt=20) # 查询id大于2,或者阅读量大于20的图书 (这时需要用到Q对象) from django.db.models import Q ''' Q(字段名__运算符=值) 或 Q()|Q() 并且 Q()%Q() not ~Q() ''' BookInfo.objects.filter(Q(id__gt=2)|Q(readcount__gt=20)) # 查询id大于2,并且阅读量大于20的书籍 BookInfo.objects.filter(Q(id__gt=2)&Q(readcount__gt=20)) # 查询书籍id不为3的书籍 BookInfo.objects.exclude(id=3) BookInfo.objects.filter(~Q(id=3))
##############################聚合函数###############################
'''
Sum,Max,Min,Avg,Count
聚合函数需要使用 aggregate
语法形式是: aggragte(XXX('字段'))
'''
# 查询数据的阅读总量
from django.db.models import Sum,Max,Min,Avg,Count
BookInfo.objects.aggregate(Sum('readcount'))
##############################排序###############################
# 默认生序排序
BookInfo.objects.all().order_by('readcount')
# 降序
BookInfo.objects.all().order_by('-readcount')
##############################关联查询############################### ''' 在bookinfo和peopleinfo两张表中,书籍和人物的关系是 1:n 书籍中没有任何关于人物的字段 人物中有关于书籍的字段 外键--book 语法形式 通过书籍查询人物信息(已知主表数据,关联查询从表数据) 主表模型(实例对象).关联模型类名小写_set.all 通过人物查询书籍信息(已知从表数据,关联查询主表数据) 从表模型(实例对象).外键 ''' # 查询书籍为1的所有人物信息 # 1.查询书籍 book4 = BookInfo.objects.get(id=1) # 2.根据书籍关联人物信息 book4.peopleinfo_set.all() # 查询人物为1的书籍信息 from book.models import PeopleInfo # 1.查询人物 person = PeopleInfo.objects.get(id=1) # 2.根据人物关联查询书籍 person.book.name # 查询图书,要求图书人物为郭靖 BookInfo.objects.filter(peopleinfo__name='郭靖') BookInfo.objects.filter(peopleinfo__name__exact='郭靖') # 查询图书,要求图书中人物的描述包含’八‘ BookInfo.objects.filter(peopleinfo__description__contains='八') # 查询书名为‘天龙八部’的所有人物 PeopleInfo.objects.filter(book__name='天龙八部') PeopleInfo.objects.filter(book__name__exact='天龙八部') # 查询图书阅读量大于30的所有人物 PeopleInfo.objects.filter(book__readcount__gt=30)
insert into bookinfo(name, pub_date,readcount,commentcount,is_delete) values ('射雕英雄传','1980-5-1',12,34,0), ('天龙八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飞狐','1987-11-11',58,24,0); SELECT * FROM bookinfo; INSERT INTO peopleinfo(`name`,gender,book_id,description,is_delete) VALUES ('郭靖',1,1,'降龙十八掌',0), ('黄蓉',0,1,'打狗棍法',0), ('黄药师',1,1,'弹指神功',0), ('欧阳锋',1,1,'蛤蟆功',0), ('梅超风',0,1,'九阴白骨爪',0), ('乔峰',1,2,'降龙十八掌',0), ('段誉',1,2,'六脉神剑',0), ('虚竹',1,2,'天山六阳拳',0), ('王语嫣',0,2,'神仙姐姐',0), ('令狐冲',1,3,'孤独九剑',0), ('任盈盈',0,3,'弹琴',0), ('岳不群',1,3,'华山剑法',0), ('东方不败',0,3,'葵花宝典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若兰',0,4,'黄衣',0), ('程灵素',0,4,'医术',0), ('袁紫衣',0,4,'六合拳',0); SELECT * FROM peopleinfo;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。