ORM - 单表实例
数据库的操作
添加
- 模型类实例化对象
1 2 3 4 5 6
| from django.shortcuts import render,HttpResponse from app01 import models def add(request): demo = models.Demo(title="我学Django",price=50,publish="Python出版社",pub_date="2024-6-22") demo.save() return HttpResponse("<p>数据添加成功!</p>")
|
- 通过 ORM 提供的 objects.create()方法
1 2 3 4 5
| from django.shortcuts import render,HttpResponse from app01 import models def add(request): demos = models.Demo.objects.create(title="我爱学习Python",price=20,publish="Python出版社",pub_date="2023-11-11") return HttpResponse("<p>数据添加成功!</p>")
|
查找
- 模型类.objects.all() 返回所有数据
1 2 3 4 5 6
| from django.shortcuts import render,HttpResponse from app01 import models def list_all(request): demos = models.Demo.objects.all() return HttpResponse("<p>查找成功!</p>")
|
- 模型类.objects.filter(条件) 返回满足条件的数据
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 42 43 44 45 46 47 48 49 50
| from django.shortcuts import render,HttpResponse from app01 import models def list_filter(request): demo1 = models.Demo.objects.filter(pk=1) print(demo1) demo2 = models.Demo.objects.filter(publish='Python出版社', price=20) print(demo2, type(demo2))
demos = models.Demo.objects.filter(price__in=[20,50])
demos = models.Demo.objects.filter(price__gt=20)
demos = models.Demo.objects.filter(price__lt=20)
demos = models.Demo.objects.filter(price__gte=20)
demos = models.Demo.objects.filter(price__lte=20)
demos = models.Demo.objects.filter(price__range=[20,50])
demos = models.Demo.objects.filter(title__contains="Python")
demos = models.Demo.objects.filter(title__icontains="Python")
demos = models.Demo.objects.filter(title__startswith="Python")
demos = models.Demo.objects.filter(title__endswith="Python")
demos = models.Demo.objects.filter(pub_date__year=2018)
demos = models.Demo.objects.filter(pub_date__month=11)
demos = models.Demo.objects.filter(pub_date__day=11) return HttpResponse("<p>查找成功!</p>")
|
- filter中的运算符号只能使用等于号,不能使用其它
- `__in`用于读取区间,`=`后面为列表
- `__gt`大于,`__lt`小于,`=`后面为数字
- `__gte`大于等于,`__lte`小于等于,`=`后面为数字
- `__range`在...之间,左右闭区间,`=`后面为两个元素的列表
- `__contains`包含,`=`后面为字符串
- `__icontains`包含,不区分大小写,`=`后面为字符串
- `__startswith`以...开头,`=`后面为字符串
- `__endswith`以...结尾,`=`后面为字符串
- `__year`是DateField数据类型的年份,`=`后面为数字
- `__month`是DateField数据类型的月份,`=`后面为数字
- `__day`是DateField数据类型的天数,`=`后面为数字
- 模型类.objects.exlude(条件) 返回不满足条件的数据
1 2 3 4 5 6 7 8 9
| from django.shortcuts import render,HttpResponse from app01 import models def list_exlude(request): demo1 = models.Demo.objects.exclude(pk=1) print(demo1) demo2 = models.Demo.objects.exclude(publish='Python出版社', price=20) print(demo2, type(demo2)) return HttpResponse("<p>查找成功!</p>")
|
- 同filter基于双下划线的模糊查询
- 模型类.objects.get(条件) 返回满足条件的第一个数据
1 2 3 4 5 6 7 8 9
| from django.shortcuts import render,HttpResponse from app01 import models def list_get(request): demo1 = models.Demo.objects.get(pk=1) demo2 = models.Demo.objects.get(pk=20) demo3 = models.Demo.objects.get(price=200) return HttpResponse("<p>查找成功!</p>")
|
- 模型类.objects.order_by(条件) 返回按照指定条件排序的数据
1 2 3 4 5 6 7
| from django.shortcuts import render,HttpResponse from app01 import models def list_order_by(request): demo1 = models.Demo.objects.order_by('price') demo2 = models.Demo.objects.order_by('-price')
|
- 参数的字段名要加引号
- 降序为在字段名前面添加负号`-`
- 模型类.objects.count() 返回满足条件的数据条数,是整数
1 2 3 4 5 6
| from django.shortcuts import render,HttpResponse from app01 import models def list_count(request): demo1 = models.Demo.objects.count() return HttpResponse("<p>查找成功!</p>")
|
- 模型类.objects.first() 返回满足条件的第一个数据,返回的数据是模型类的对象,可以用索引下标
[0]
1 2 3 4 5 6
| from django.shortcuts import render,HttpResponse from app01 import models def list_first(request): demo1 = models.Demo.objects.first() return HttpResponse("<p>查找成功!</p>")
|
- 模型类.objects.last() 返回满足条件的最后一个数据,返回的数据是模型类的对象,不可以用索引下标
[-1]
,ORM 没有逆序索引
1 2 3 4 5 6
| from django.shortcuts import render,HttpResponse from app01 import models def list_last(request): demo1 = models.Demo.objects.last() return HttpResponse("<p>查找成功!</p>")
|
- 模型类.objects.exists() 返回满足条件的数据是否存在,返回的数据是布尔值
1 2 3 4 5 6 7 8 9 10 11
| from django.shortcuts import render,HttpResponse from app01 import models def list_exists(request): demo1 = models.Demo.objects.exists()
demo2 = models.Demo.objects.count().exists()
demo3 = models.Demo.objects.first().exists() return HttpResponse("<p>查找成功!</p>")
|
- 模型类.objects.reverse() 返回满足条件的数据,并按照条件倒序排列
1 2 3 4 5 6
| from django.shortcuts import render,HttpResponse from app01 import models def list_reverse(request): demos = models.Demo.objects.order_by("-price").reverse() return HttpResponse(demos)
|
- 模型类.objects.values() 返回部分字段的数据,返回的数据是字典类型,字典的键是字段名,字典的值是字段值
1 2 3 4 5
| from django.shortcuts import render,HttpResponse from app01 import models def list_values(request): demos = models.Demo.objects.values("name","price") return HttpResponse(demos)
|
- 参数的字段名要加引号
- 想要字段和数据用values
- 模型类.objects.values_list() 返回部分字段的数据,返回的数据是元组类型,元组的元素是字段值
1 2 3 4 5
| from django.shortcuts import render,HttpResponse from app01 import models def list_values_list(request): demos = models.Demo.objects.values_list("name","price") return HttpResponse(demos)
|
- 参数的字段名要加引号
- 只想要数据用values_list
- 模型类.objects.distinct() 返回满足条件的数据,并去除重复的数据
1 2 3 4 5
| from django.shortcuts import render,HttpResponse from app01 import models def list_distinct(request): demos = models.Demo.objects.values("name").distinct() return HttpResponse(demos)
|
- 对模型类的对象去重没有意义,因为每个对象都是不一样的
- 一般联合values或者values_list使用
删除
- 使用模型类的对象.delete()
1
| demos=models.Demo.objects.filter(pk=1).first().delete()
|
- 返回值:元组,第一个元素为受影响的行数
- 使用 QuerySet 类型数据.delete() 推荐
1
| demos=models.Demo.objects.filter(pk__in=[1,3]).delete()
|
- 返回值:元组,第一个元素为受影响的行数
- 注意:
- Django 删除数据时,会模仿 SQL 的约束行为,即删除一个对象也会删除与它相关联的外键对象
- 要删除所有数据,必须要写 all().delete()
修改
- 使用模型类的对象.save()
1 2 3
| demos = models.Demo.objects.filter(pk=1).first() demos.price = 233 demos.save()
|
- 使用 QuerySet 类型数据.update([字段名]=更改的数据) 推荐
1 2 3 4 5
| from django.shortcuts import render,HttpResponse from app01 import models def demo_update(request): demos = models.Demo.objects.filter(pk__in=[1,3]).update(price=233) return HttpResponse(demos)
|
- 返回值:受影响的行数