Django模型基础

接上一节

新增了一个模型字段

并执行迁移后

python 复制代码
python3 manage.py makemigrations
python3 manage.py migrate 

这样我们就可以看到后台页面就会多出一个'用户类型'的下拉选项

因为这边的用户类型2是添加了editable=False 所以默认是不显示的 但在数据库中我们是可以看到这个字段的

modles的基本操作

一般的数据库操作流程!

1.创建数据库,设计表结构和字段

2.连接Mysql数据库,并编写数据访问层代码

3.业务逻辑层去调用数据访问层执行数据库操作

Django通过Model操作数据库,不管你数据库的类型是MySq1或者Sqlite,Django自动帮你生成相应数据库类型的Django帮我们自动完成。只要会写Model就可以了。SQL语句,所以不需要关注SQL语句和类型,对数据的操作apping,简称ORM)框架去操控数据库。

django使用对象关系映射(0bject Relational M:是一种程序技术,用于实现面向对象编程语言里不同类型系

ORM(0bject Relational Mapping)对象关系映射统的数据之间的转换。

增删改查

#ORM:

模型<=>表

类结构 ->表结构

对象->表的一条数据

类属性->表的字段

models基本操作

#增:

1)创建对象实例,然后调用save方法:

obj = Author()

obj.first_name ='zhang'

obj.last_name ='san'

obj.save()

2)创建对象并初始化,再调用save方法:

obj = Author(first_name='zhang', last_name='san')

obj.save()

3)使用create方法

Author.objects.create(first_name='li', last_name='si')

4)使用get_or_create方法,可以防止重复

Author.objects.get_or_create(first name='zhang', last name='san')

新增一个模型类 创建一个表

注意 需要数据迁移

如果models.py文件有变动,需要重新迁移

生成迁移文件:python manage.py makemigrations

执行迁移文件:python manage.py migrate

ORM 对象关系映射

模型类 => 表结构

类属性 => 表字段

一个对象 => 表的一行记录

在views.py 增加视图函数

python 复制代码
# 增加函数
def add_person(request):
    # 方式1
    p = PersonModel()
    p.name = "zhangsan"
    p.age = 20
    p.save()  # 同步数据到数据库

    return HttpResponse("增加成功")

增加一个urls

python 复制代码
path("add/", add_person),  # 添加数据

访问http://127.0.0.1:8000/add/

我们可以看到数据库中成功增加了一条数据

在创建的时候我们设置了unique=True 再次执行同一个名字增加到数据库的时候会报错

可以增加一个try

python 复制代码
 # 方式2
    try:
        p = PersonModel(name="王五", age=33)
        p.save()  # 同步数据到数据库
    except Exception as e:
        return HttpResponse(f"增加失败:{e}")

    return HttpResponse("增加成功")
python 复制代码
# 方式3
    try:
        PersonModel.objects.create(name="刘德华", age=60)
    except Exception as e:
        return HttpResponse(f"增加失败:名字已存在")

    return HttpResponse("增加成功")
python 复制代码
# 方式4
    try:
        ret = PersonModel.objects.get_or_create(name="张学友", age=60)
        print("ret:", ret)
    except Exception as e:
        return HttpResponse(f"增加失败:名字已存在")

    return HttpResponse("增加成功")

ret: (<PersonModel: PersonModel object (5)>, True)

[07/May/2024 11:03:27] "GET /add/ HTTP/1.1" 200 12

第一次创建就是True 如果已经存在会显示Flase

python 复制代码
# 添加多条数据
    for i in range(10, 21):
        PersonModel.objects.create(name=f"张{i}峰", age=i)
    return HttpResponse("增加成功")

删除数据

删除第一条数据

python 复制代码
# 删除数据
def del_person(request):
    # 删除数据
    # 1.先找到要删除的数据
    # 2.然后删除
    try:
        p = PersonModel.objects.first()  # 第一条数据
        p.delete()  # 删除数据
    except Exception as e:
        return HttpResponse(f"删除失败:{e}")
    return HttpResponse("删除成功")

删除多条数据

python 复制代码
PersonModel.objects.filter(age__gt=50).delete()  # 删除age大于50的数据

修改数据

python 复制代码
# 修改数据
def update_person(request):
    # 先找到修改的数据
    # 然后修改数据
    try:
        p = PersonModel.objects.first()  # 第一条数据
        p.age = 666
        p.save()  # 同步数据到数据库
    except Exception as e:
        return HttpResponse(f"修改失败:{e}")
    return HttpResponse("修改成功")

修改多条数据 举例把所有数据的age 修改为100

python 复制代码
PersonModel.objects.all().update(age=100)

也可以指定修改某一条数据

python 复制代码
p = PersonModel.objects.first()  # 第一条数据
        p.age = 666
        p.save(update_fields=["age"])

查询数据

get():获取单条数据:

Author.objects.get(id=123)

如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常

如果找到多个,会引发模型类.Multiple0bjectsReturned 异常

first():返回查询集(QuerySet)中的第一个对象

last():返回查询集中的最后一个对象

count():返回当前查询集中的对象个数

exists():判断查询集中是否有数据,如果有数据返回True没有反之

all():获取全部数据:

Author.objects.all()

values():获取指定列的值,可以传多个参数!返回包含字典的列表(保存了字段名和对应的值)

Author.objects.all().values('password')

values_list():获取指定列的值,可以传多个参数!返回包含元组列表(只保存值)

Author.objects.all().values_list('password')

进阶操作:

#获取个数

Author.obfects.filter(name='seven').count()

Author.objects.filter(id__gt=1) #获取id大于1的值

select * from Author where id>1

Author.objects.filter(id__gte=1) #获取id大于或等于1的值

select * from Author where id >=1

Author.objects.filter(id__lt=10) # 获取id小于10的值

select * from Author where id< 10

Author.objects.filter(id__lte=10)#获取id小于或等于10的值

select * from Author where id <= 10

Author.objects.filter(id__lt=10,id__gt=1) #获取id大于1 且 小于18的值

select * from Author where id < 10 and id>1

Author.objects.filter(id__in=[11,22,33]) #获取id在11、22、33中的数据

select * from Author where id in(11,22,33)

Author.objects.exclude(id__in=[11,22,33]) # not in

select * from Author where id not in(11,22,33)

Author.objects,filter(name__contains="ven") # contains(和数据库中like语法相同)

select * from Author where name like '%ven%"

Author.objects.filter(name icontains="ven")# icontains大小写不敏感

Author.objects.filter(nameAuthor.objects.filter(name_regex="^ven")# 正则匹配

Author.objects.filter(nameAuthor.objects.filter(name_iregex="^ven")# 正则匹配忽略大小写 Author.objects.filter(age__range=[10,20])#范围bettwen and

startswith,istartswith,endswith,iendswith:

#以什么开始,以什么结束,和上面一样带i的是大小写不敏感的,其实不带i的也忽略大小写

Author.objects.filter(name='seven').order_by('id')# asc升序 Author.objects.filter(name='seven').order_by('-id')# desc降序

Author.objects.all()[10:20 # 切片,取所有数据的10条到20条,分页的时候用的到

#手动分页

page 页码

per_page 每页数量 =5

第1页(page=1):0-4 =>[0:5]

第2页(page=2):5-9 =>[5:10]

]第3页(page=3):10-14 =>[10:15]

第4页(page=4):15-19 =>[15:20]

每一页数据范围

[(page-1)*per_page: page*per_page]

聚合

使用aggregate()函数返回聚合函数的值

Avg:平均值

Count:数量

Max:最大

Min:最小

Sum:求和

python 复制代码
from django.db.models import Count,Min,Max,Sum

        Author.objects.aggregate(Max('age'))

查询数据的内容比较多下一节再进行详细演示

相关推荐
IFTICing7 分钟前
【文献阅读】Attention Bottlenecks for Multimodal Fusion
人工智能·pytorch·python·神经网络·学习·模态融合
大神薯条老师11 分钟前
Python从入门到高手4.3节-掌握跳转控制语句
后端·爬虫·python·深度学习·机器学习·数据分析
程序员爱德华13 分钟前
Python环境安装教程
python
阿维的博客日记14 分钟前
图文并茂解释水平分表,垂直分表,水平分库,垂直分库
数据库·分库分表
huanxiangcoco17 分钟前
152. 乘积最大子数组
python·leetcode
萧鼎1 小时前
Python常见问题解答:从基础到进阶
开发语言·python·ajax
2401_857622661 小时前
Spring Boot新闻推荐系统:性能优化策略
java·spring boot·后端
PythonFun1 小时前
Python技巧:如何避免数据输入类型错误
前端·python
kaikai_sk1 小时前
搜索引擎相关的一段实习经历
python
qinzechen1 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#