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'))

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

相关推荐
风象南37 分钟前
我把大脑开源给了AI
人工智能·后端
NineData3 小时前
NineData 迁移评估功能正式上线
数据库·dba
橙序员小站5 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德5 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆7 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
NineData8 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
开心就好20258 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字9 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常9 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强9 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端