ORM (object relationship mapping): 对象关系映射
使用SQL语句对数据进行增删改查虽然很方便,但不同的数据库总有大大小小的差异
这时ORM就可来消除这中差异,对于不同的数据库它可以转化成不同的语句,在一些方面减少了工作量
1.准备工作
创建应用: python manage.py startapp 应用名称
在创建的应用工程文件下的models.py添加模型
下面添加一个学生表
from django.db import models
# Create your models here.
class Student(models.Model):
s_name = models.CharField(max_length=10, unique=True)
s_age = models.IntegerField(default=20)
s_gender = models.BooleanField(default=1)
# auto_now_add:创建时默认字段赋值为最新时间
create_time = models.DateTimeField(auto_now_add=True)
# auto_now:修改数据时,自动赋值为更新字段的时间
update_time = models.DateTimeField(auto_now=True)
math = models.DecimalField(max_digits=3, decimal_places=1, null=True)
physics = models.DecimalField(max_digits=3, decimal_places=1, null=True)
class Meta:
db_table = 'student'
2.在项目工程目录下settting文件中添加对应的url
urlpatterns = [
path('admin/', admin.site.urls),
# http://127.0.0.1:8080/hello/
path('hello/', views.hello),
path('add_stu/', views.add_stu),
path('del_stu/', views.del_stu),
path('up_stu/', views.up_stu),
path('sel_stu/', views.sel_stu),
]
然后需要在views.py中添加对应的方法
from django.db.models import Avg, Max, Min, Sum, Count, Q, F
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
from app.models import Student
def hello(request):
# 读取数据库
# 渲染页面
return HttpResponse('<h1>hello world</h1>')
def add_stu(request):
"""添加信息"""
# 方法一
Student.objects.create(s_name='张三丰', s_age=99)
# 方法二
stu = Student()
stu.s_name = '老白'
stu.s_age = 60
stu.save()
return HttpResponse('添加成功')
def del_stu(request):
"""删除信息"""
Student.objects.filter(id=3).delate()
return HttpResponse('删除成功')
def up_stu(request):
"""更新信息"""
# 方法一
Student.objects.filter(id=6).update(math=90, physics=88)
# 方法二
stu = Student.objects.filter(id=7).first()
stu.math = 99
# stu.physics = 100
stu.save()
return HttpResponse('更新成功')
def sel_stu(request):
"""查询学生信息"""
# 查询全部
stus = Student.objects.all()
for stu in stus:
print(stu.s_name, stu.s_gender)
stu = Student.objects.filter(id=4).first()
print(stu)
# 1. get() 取唯一的一个对象
# 2. get() 条件必须成立 上面的filter如果条件没有,返回为空
stu = Student.objects.get(id=4) # 与前面的方法一样 但只能取唯一一个
print(stu)
# 过滤掉不满足掉件的
stus = Student.objects.exclude(s_gender=0)
print(stus)
# 排序
stus = Student.objects.order_by('-id') # 加 “-” 就降序
print(stus)
# 取出对象中的某个字段
stus = Student.objects.all().values('s_name', 's_age')
print(stus)
stus = Student.objects.all().values() # 工作中比较有用 据说获取时间快
print(stus)
# 判断查询结果是否存在 exists()
a = Student.objects.filter(s_name='校长').exists()
b = Student.objects.filter(s_gender=1).count()
print(a)
print(b)
# 字段__运算符
# 包含,模糊查询;contains
stus = Student.objects.filter(s_name__contains='鲲')
print(stus)
# slq中 like
# startswith endswith
stus = Student.objects.filter(s_name__startswith='张')
print(stus)
stus = Student.objects.filter(s_name__endswith='三')
print(stus)
# sql where id in(1,2,3,4,5,6)
stus = Student.objects.filter(id__in=[1, 2, 3, 4, 5, 6, 7, 8])
print(stus)
stus = Student.objects.filter(pk__in=[1, 2, 3, 4, 5, 6, 7, 8])
print(stus)
# gte 大于等于 gt 大于 lt 小于 lte 小于等于
stus = Student.objects.filter(s_age__gte=18, s_age__lte=22) # 18<= <=22
print(stus)
stus = Student.objects.filter(s_age__gte=18).filter(s_age__lte=22) # 和上面查询的结果相同
print(stus)
# Q() 中间以 | 隔开
stus = Student.objects.filter(Q(s_age__gte=18) | Q(s_age__lte=22)) # 18<= 或 <=22
print(stus)
stus = Student.objects.filter(Q(s_age__gte=18) & Q(s_age__lte=22)) # 与
print(stus)
stus = Student.objects.filter(~Q(s_age__gte=18)) # 非
print(stus)
# 聚合 Avg Max Min Sum Count
age_avg = Student.objects.all().aggregate(Avg('s_age'))
age_max = Student.objects.all().aggregate(Max('s_age'))
age_min = Student.objects.all().aggregate(Min('s_age'))
age_sum = Student.objects.all().aggregate(Sum('s_age'))
age_count = Student.objects.all().aggregate(Count('s_age'))
print(age_avg)
print(age_max)
print(age_min)
print(age_sum)
print(age_count)
# 查询物理成绩大于数学成绩的学生姓名
# 方法一
stus = Student.objects.all()
for stu in stus:
if stu.physics > stu.math:
print(stu.s_name)
# 方法二
stus = Student.objects.filter(physics__gt=F('math')).values()
print(stus)
return HttpResponse('查询信息成功')
网友评论