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("增加成功") ``` ![](https://file.jishuzhan.net/article/1790473403568754689/02025f3421e6e688b46598dc484e255f.webp) #### 删除数据 删除第一条数据 ```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'))

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

相关推荐
逢生博客17 分钟前
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
python·sqlite·uv·deepseek·trae·cherry studio·mcp服务
异常君18 分钟前
Java 高并发编程:等值判断的隐患与如何精确控制线程状态
java·后端·代码规范
异常君18 分钟前
Java 日期处理:SimpleDateFormat 线程安全问题及解决方案
java·后端·代码规范
Java水解19 分钟前
Mysql之存储过程
后端·mysql
用户40993225021220 分钟前
Tortoise-ORM级联查询与预加载性能优化
后端·ai编程·trae
bookcman20 分钟前
Seata 部署手册
后端·架构
都叫我大帅哥20 分钟前
《@SpringBootApplication:Spring Boot的"一键启动"按钮,还是程序员的"免死金牌"?》
java·后端·spring
樟小叶_公众号同名21 分钟前
Kafka运维经验
后端·kafka
lizhongxuan22 分钟前
pgBackRest备份解析
后端
Undoom22 分钟前
Trae 宝藏功能实测:从 Mcp 搭建天气系统,到 AI 重塑 Excel 数据处理
后端