当前位置:   article > 正文

Django/静态文件/apps配置/模型/数据库/shell_django apps

django apps

一、debug和basedir

1、debug

在这里插入图片描述

2、basedir

当前文件的上一级的上一级绝对路径:/root/PycharmProjects/bookmanage

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
  • 1
  • 2

二、静态文件

  • 项目中的CSS、图片、js都是静态文件,一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,django中提供了一种解析的方式配置静态文件路径,静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。
  • 提供静态文件,需要配置两个参数:
    • STATICFILES_DIRS存放查找静态文件的目录
    • STATIC_URL访问静态文件的URL前缀
1、在主工程中创建一个static文件夹,存放静态文件

在这里插入图片描述

2、配置静态文件路径

在settings.py文件中添加一行

# 告知系统静态文件的路径
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
  • 1
  • 2

在这里插入图片描述

在这里插入图片描述

三、apps配置相关

1、apps.py中的类在注册子应用时使用

在这里插入图片描述

2、verbose_name 属性
from django.apps import AppConfig


class BookConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'book'
    # 改变管理平台中的标题
    verbose_name = '后台相关'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

四、模型

1、字段类型
  • AutoField:自动增长的IntegerField,通常不用指定,不指定时,Django会自动创建属性名为id的自动增长属性
  • BooleanField:布尔字段,值为True或False
  • NullBooleanField:支持Null、True、False三种值
  • CharField:字符串,参数max_digits表示最大字符个数
  • TextField:大文本字段,一般超过4000个字符时使用
  • IntegerField:整数
  • DecimalField:十进制浮点数,参数max_digits表示总位数,参数decimal_places表示小数位数
  • FloatField:浮点数
  • DateField:日期,参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于最后一次修改的时间戳,它总是使用当前时间默 认为False;参数auto_now_add表示当前对象第一次被创建时自动设置当前时间,用于创建时间戳,它总是使用当前时间,默认为False;参数auto_now_add和auto_now是互相排斥的,组合将会发生错误。
  • TimeField:时间,参数同DateField
  • FileField:上传文件字段
  • ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
2、选项
  • max_length:charfield必须设置该选项
  • null:如果为True,表示允许为空,默认值是False
  • blank:如果为True,则该字段允许为空白,默认值是False
  • db_column:字段的名称,如果未指定,则使用属性的名称
  • db_index:如果值为True,则在表中会为该字段创建索引,默认值是False
  • unique:如果为True,这个字段在表中必须有唯一值,默认值是False
  • default:设置默认值
  • verbose_name:admin后台显示
  • primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
3、 外键

在设置外键时 ,需要通过on_delete选项指明主表删除数据是时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

  • CASCADE级联,删除主表 数据时连同一起删除外键中的数据
  • PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
  • SET_NULL设置为NULL,仅在该字段null= True,允许为null时可用
  • SET()设置为特定值或者调用特定方法
  • DO_NOTHING不做任何操作,如果数据库指明级联性,此选项抛出IntegrityError异常
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

五、修改数据库引擎

1、安装PyMySQL驱动程序
pip3 install PyMySQL
  • 1
2、在Django的工程同名子目录__init__.py文件中添加如下语句:

作用是让Django的ORM能以mysqldb的方式来调用PyMySQL

import pymysql
pymysql.install_as_MySQLdb()
  • 1
  • 2

在这里插入图片描述

3、修改DATABASES配置信息,工程中的settings.py

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        'HOST':'localhost', # 主机
        'PORT':'3306',# 端口
        'USER':'root',# 用户名
        'PASSWORD':'123456',# 密码
        'NAME': 'bookmanage_db',# 指定数据库
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

再进行模型迁移

六、shell的使用

运行shell

python3 manage.py shell
  • 1

在这里插入图片描述

七、数据的增删改查

1、新增数据
##############################新增数据###############################
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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

2、修改/更新数据
##############################修改/更新数据###############################
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
3、删除数据
##############################删除数据###############################

# 方式一
# 1.先查询出来数据
book = BookInfo.objects.get(id = 5)
# 2.直接调用delete方法
book.delete()

# 方式二
BookInfo.objects.filter( id = 6).delete()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

4、查询数据
##############################查询数据###############################
# 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

在这里插入图片描述
在这里插入图片描述

5、filter,get,exclude
##############################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')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
F对象
##############################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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Q对象
##############################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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
聚合函数
##############################聚合函数###############################
'''
Sum,Max,Min,Avg,Count

聚合函数需要使用 aggregate
语法形式是: aggragte(XXX('字段'))
'''
# 查询数据的阅读总量
from django.db.models import Sum,Max,Min,Avg,Count
BookInfo.objects.aggregate(Sum('readcount'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
排序
##############################排序###############################
# 默认生序排序
BookInfo.objects.all().order_by('readcount')
# 降序
BookInfo.objects.all().order_by('-readcount')
  • 1
  • 2
  • 3
  • 4
  • 5
关联查询
##############################关联查询###############################
'''
在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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

八、数据库表

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/624423
推荐阅读
相关标签
  

闽ICP备14008679号