Python - Django Web开发(4)

ORM - 单表实例

数据库的操作

添加

  1. 模型类实例化对象
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>")
  1. 通过 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>")

查找

  1. 模型类.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()
# QuerySet类型,类似于list。
return HttpResponse("<p>查找成功!</p>")
  1. 模型类.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)
# pk=1 相当于 id=1
# 因为id在pycharm内有特殊含义,是查看内存地址的内置函数
print(demo1)
demo2 = models.Demo.objects.filter(publish='Python出版社', price=20)
print(demo2, type(demo2))
# QuerySet类型,类似于list。

# 查询价格为20或者50的数据
demos = models.Demo.objects.filter(price__in=[20,50])

# 查询价格大于20的数据
demos = models.Demo.objects.filter(price__gt=20)

# 查询价格小于20的数据
demos = models.Demo.objects.filter(price__lt=20)

# 查询价格大于等于20的数据
demos = models.Demo.objects.filter(price__gte=20)

# 查询价格小于等于20的数据
demos = models.Demo.objects.filter(price__lte=20)

# 查询价格在20到50之间的数据
demos = models.Demo.objects.filter(price__range=[20,50])

# 查询包含"Python"的数据
demos = models.Demo.objects.filter(title__contains="Python")

# 查询包含"Python"的数据,不缺分大小写
demos = models.Demo.objects.filter(title__icontains="Python")

# 查询以"Python"开头的数据
demos = models.Demo.objects.filter(title__startswith="Python")

# 查询以"Python"结尾的数据
demos = models.Demo.objects.filter(title__endswith="Python")

# 查询出版本为2018年的数据
demos = models.Demo.objects.filter(pub_date__year=2018)

# 查询出版本为2018年11月的数据
demos = models.Demo.objects.filter(pub_date__month=11)

# 查询出版本为2018年11月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数据类型的天数,`=`后面为数字
  1. 模型类.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))
# QuerySet类型,类似于list。
return HttpResponse("<p>查找成功!</p>")
- 同filter基于双下划线的模糊查询
  1. 模型类.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>")
  1. 模型类.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')
# 降序
- 参数的字段名要加引号
- 降序为在字段名前面添加负号`-`
  1. 模型类.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>")
  1. 模型类.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>")
  1. 模型类.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>")
  1. 模型类.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()

# 报错,判断的数据类型只能为QuerySet类型数据,不能为整型
demo2 = models.Demo.objects.count().exists()

# 报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
demo3 = models.Demo.objects.first().exists()
return HttpResponse("<p>查找成功!</p>")
  1. 模型类.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)
  1. 模型类.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
  1. 模型类.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
  1. 模型类.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使用

删除

  1. 使用模型类的对象.delete()
1
demos=models.Demo.objects.filter(pk=1).first().delete()
- 返回值:元组,第一个元素为受影响的行数
  1. 使用 QuerySet 类型数据.delete() 推荐
1
demos=models.Demo.objects.filter(pk__in=[1,3]).delete()
- 返回值:元组,第一个元素为受影响的行数
  • 注意:
    • Django 删除数据时,会模仿 SQL 的约束行为,即删除一个对象也会删除与它相关联的外键对象
    • 要删除所有数据,必须要写 all().delete()

修改

  1. 使用模型类的对象.save()
1
2
3
demos = models.Demo.objects.filter(pk=1).first()
demos.price = 233
demos.save()
  1. 使用 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)
- 返回值:受影响的行数