Django模型

问题

1.创建应用(进入bookmanager02工程名)

python manager.py startapp book

报错:can’t open file ‘manager.py’: [Errno 2] No such file or directory
改用:django-admin startapp book

创建MySQL数据库

1、创建数据库

cmd
mysql -uroot -proot
create database book charset utf8;
use book;

2、运行异常
Django模型
解决:pip install mysqlclient(虚拟环境下)

模型

Django模型

from django.db import models

# Create your models here.
"""
https://docs.djangoproject.com/en/3.1/

1. 模型类 需要继承自 models.Model
2. 定义属性
    id 系统默认会生成
    属性名=models.类型(选项)
    
    2.1 属性名 对应 就是字段名
        不要使用 python,MySQL关键字
        不要使用连续的下划线(__)
    2.2 类型  MySQL的类型  
    2.3 选项  是否有默认值,是否唯一,是否为null
            CharField 必须设置 max_length
            verbose_name 主要是 admin站点使用
            
3. 改变表的名称
    默认表的名称是: 子应用名_类名 都是小写
    修改表的名字
create table `qq_user` (
    id int ,
    name varchar(10) not null default ''
)  
"""
class BookInfo(models.Model):
    # date 日期
    # data  数据
    name=models.CharField(max_length=10,unique=True)
    pub_date=models.DateField(null=True)
    readcount=models.IntegerField(default=0)
    commentcount=models.IntegerField(default=0)
    is_delete=models.BooleanField(default=False)
    # 1对多的关系模型中
    # 系统会为我们自动添加一个 关联模型类名小写_set
    #
    #peopleinfo_set=[PeopleInfo,PeopleInfo,...]

    #peopleinfo
    def __str__(self):
        return self.name

    class Meta:
        db_table='bookinfo'  # 修改表的名字
        verbose_name='书籍管理' #admin站点使用的(了解)

数据迁移(进入bookmanager02)

python manage.py makemigrations
python manage.py migrate

django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax;

解决:
Django2.1不再支持MySQL5.5,必须5.6版本以上。。。
卸载重装吧!!!

MySQL 卸载与安装8.0(Windows10)

外键

Django模型

初始化数据

insert into bookinfo(name, pub_date, readcount, commentcount, is_delete) values
('射雕英雄传', '1980-12-1',12,34,0),
('天龙八部', '1986-7-24',36,40,0),
('笑傲江湖', '1996-4-6',20,80,0),
('雪山飞狐', '1987-11-8',58,24,0)

insert into peopleinfo(name, gender, book_id, description, is_delete) values
('郭靖', 1,1,'降龙十八掌',0),
('黄蓉', 0,1,'打狗棒',0),
('黄药师', 1,1,'弹指神通',0),
('欧阳锋', 1,1,'蛤蟆功',0),
('乔峰', 1,2,'降龙十八掌',0),
('段誉', 1,2,'凌波微步',0),
('令狐冲', 1,3,'独孤九剑',0),
('岳不群', 1,3,'葵花宝典',0),
('胡一刀', 1,4,'胡家刀法',0)

Shell的作用

控台执行

python manage.py shell

>>> from book.models import BookInfo
>>> BookInfo.objects.all()
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>]>
>>>

查看数据库日志
Django模型
68 69 # 去除,重启

查看日志
mysql.log

数据增删改查

def index(request):
    book = BookInfo.objects.all()
    print(book)

    return HttpResponse('index')

# ###########################################
from book.models import BookInfo
# 方式1
book=BookInfo(
    name='Django',
    pub_date='2000-1-1',
    readcount=10
)
# 必须要调用 对象的save方法才能将数据保存到数据库中
book.save()


#方式2
# objects -- 相当于一个代理 实现增删改查
#
BookInfo.objects.create(
    name='测试开发入门',
    pub_date='2020-1-1',
    readcount=100
)

########################修改数据################################

# 方式1
# select * from bookinfo where id=6
book=BookInfo.objects.get(id=6)

book.name='运维开发入门'

# 想要保存数据 需要调用 对象的save方法
book.save()


# 方式2
# filter 过滤
BookInfo.objects.filter(id=6).update(name='爬虫入门',commentcount=666)

# 错误的
# BookInfo.objects.get(id=5).update(name='5555',commentcount=999)


#####################删除数据#####################

# 方式1

book=BookInfo.objects.get(id=6)

# 删除分2中, 物理删除(这条记录的数据 删除) 和 逻辑删除(修改标记位 例如 is_delete=False)

book.delete()


# 方式2
BookInfo.objects.get(id=6).delete()
BookInfo.objects.filter(id=5).delete()

查询操作

基础查询

# 查询书名包含'湖'的图书

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        e  equal
#
# 小于 lt             litte
# 小于等于 lte
BookInfo.objects.filter(id__gt=3)

# 查询编号不等于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')

# 错误的
# BookInfo.objects.filter(pub_date__gt='199011')


F和Q对象

两属性比较F

#################################################

from django.db.models import F

# 使用: 2个属性的比较
#语法形式: 以filter 为例  模型类名.objects.filter(属性名__运算符=F('第二个属性名'))

# 查询阅读量大于等于评论量的图书


BookInfo.objects.filter(readcount__gte=F('commentcount'))


#####################################

# 并且查询
# 查询阅读量大于20,并且编号小于3的图书。

BookInfo.objects.filter(readcount__gt=20).filter(id__lt=3)
#或者
BookInfo.objects.filter(readcount__gt=20,id__lt=3)

查询阅读量大于20,或者编号小于3的图书

from django.db.models import Q

# 或者语法:  模型类名.objects.filter(Q(属性名__运算符=值)|Q(属性名__运算符=值)|...)
# 并且语法:  模型类名.objects.filter(Q(属性名__运算符=值)&Q(属性名__运算符=值)&...)
# not 非 语法:  模型类名.objects.filter(~Q(属性名__运算符=值))
#
BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))


# 查询编号不等于3的书籍
BookInfo.objects.exclude(id=3)

BookInfo.objects.filter(~Q(id=3))

聚合函数与排序函数

聚合函数aggregate

from django.db.models import Sum,Max,Min,Avg,Count

# 模型类名.objects.aggregate(Xxx('字段名')

BookInfo.objects.aggregate(Sum('readcount'))

排序

BookInfo.objects.all().order_by('readcount')

多表级联查询

# 查询书籍为1的所有人物信息
# 获取了id为1的书籍
book=BookInfo.objects.get(id=1)

book.peopleinfo_set.all()


# PeopleInfo.objects.filter(book=1)



# 查询人物为1的书籍信息
person=PeopleInfo.objects.get(id=1)

person.book.name
person.book.readcount

关联过滤查询

# 语法形式
# 查询1的数据, 条件为 n
# 模型类名.objects.(关联模型类名小写__字段名__运算符=值)

# 查询图书,要求图书人物为"郭靖"
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__name='郭靖')

# 查询图书,要求图书中人物的描述包含"八"
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)


查询集QuerySet

1、两大特性:惰性查询

books = BookInfo.objects.all()
#迭代操作,才真正执行
for book in books
Print(book)

2、缓存

from book.model import BookInfo
[book.id for book in BookInfo.objects.all()]

3、限制查询集合-切片

books = BookInfo.objects.all()[0:2]
books

4、分页

查询数据

Books = BookInfo.objects.all()

导入分页类

from django.core.paginator import Paginator

创建分页实例

paginator = Paginator(books, 2)

获取指定页码数据

page_book = paginator.page(1)
#获取分页数据
total_pages = paginator.num_pages

上一篇:2021/10/19.两个小项目实战(Servlect常用对象)


下一篇:深究Spring中Bean的生命周期