Django Web开发之model操作
2021-03-23 05:26
标签:djang 负数 tab objects tom let 老师 大于 条件 model常用操作对应的就是数据库中的增删改查 示例文件 查询函数 all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。 查询集特性 学生和班级就是一对多关系,一个学生对应一个班级,一个班级则对应多个学生 通过学生,查找班级的title 查询1年级1班的所有学生 create add 删除remove 查询1年级1班的老师 聚合 聚合操作包含如下: aggregate:调用这个函数来使用聚合。 返回值是一个字典 分组 分组使用annotate() Django Web开发之model操作 标签:djang 负数 tab objects tom let 老师 大于 条件 原文地址:https://www.cnblogs.com/luckyleaf/p/12690405.htmlmodel操作
参照文档https://docs.djangoproject.com/zh-hans/2.2/topics/db/models/from django.db import models
class Students(models.Model):
"""学生表"""
username = models.CharField(max_length=64, null=False, unique=True)
age = models.IntegerField()
cls = models.ForeignKey(‘ClassInfo‘, on_delete=models.DO_NOTHING)
class ClassInfo(models.Model):
"""班级表"""
title = models.CharField(max_length=64, null=False, unique=True)
teachers = models.models.ManyToManyField("Teachers")
class Teachers(models.Model):
"""老师表"""
name = models.CharField(max_length=16, null=False, unique=True)
1.单表操作
1.1增加数据
obj = models.Students(username=‘张三‘, cls_id=‘1‘)
obj.save()
models.Students.objects.create(username=‘张三‘, cls_id=‘1)
1.2查询数据
# 获取id为1的学生
models.Students.objects.get(id=‘1‘)
# 查询id=1的学生
obj = models.Students.objects.filter(id=‘1‘)
# 查询年龄大于19的学生
obj = models.Students.objects.filter(age__gt=19)
# 查询年龄大于19小于22的学生
obj = models.Students.objects.filter(age__gt=19, age__lt=22)
# 查询id在[1, 3, 5, 6]的学生
obj = models.Students.objects.filter(id__in=[1, 3, 5, 6])
# 查询名字包含“伟”的学生
obj = models.Students.objects.filter(username__contains==‘伟‘)
stu_list = models.Students.objects.all() # 返回查询集,里面都是对象
stu_list = models.Students.objects.values() # 返回查询机,里面都是字典,不写字段,默认显示错有
stu_list = models.Students.objects.values_list() # 返回查询机,里面都是元组
1.3修改数据
# 修改id为1的学生的班级
obj = models.Students.objects.filter(id=‘1‘) # 通过查询找到id为1的学生
obj.update(cls_id=2) # 使用update更新该学生信息
1.4删除数据
# 修改id为1的学生的班级
obj = models.Students.objects.filter(id=‘1‘) # 通过查询找到id为1的学生
obj.delete() # 使用delete() 删除
1.5查询集
函数名
功能
返回值
说明
get
返回表中满足条件的一条且只能有一条数据
返回值是一个模型类对象
参数中写查询条件,1)如果查到多条数据,则抛异常MultipleObjectsReturned。2)查询不到数据,则抛异常:DoesNotExist。
all
返回模型类对应表格中的所有数据。
返回值是QuerySet类型
查询集
filter
返回满足条件的数据。
返回值是QuerySet类型
参数写查询条件。
exclude
返回不满足条件的数据。
返回值是QuerySet类型
参数写查询条件。
order_by
对查询结果进行排序。
返回值是QuerySet类型 参数中写根据哪些字段进行排序。
1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。
2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。
3)可以对一个查询集进行取下标或者切片操作来限制查询集的结果, 类似列表。对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。2 .关联操作
2.1 一对多操作
stu_obj = model.Stuents.objects.get(id=1)
cls_title = stu_obj.cls.title
## 使用双下划线方式
cls_obj = model.Stuents.objects.filter(id=1).values_list("classinfo__title")
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
stu_list = cls_obj.students_set.all()
2.2 多对多操作
# 为1年级1班新建一名老师
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
cls_obj.teachers.create(name=‘张老师‘)
# 指派id为1的李老师到1年级1班
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
teacher_obj = models.Teachers.filter(id=1)
cls_obj.teachers.add(teacher_obj)
# 也可以添加多个
teacher_list = models.Teachers.filter(id__in = [1, 2, 3, 4, 5])
cls_obj.teacher.add(*teacher_list)
# 也可以直接添加id
cls_obj.teacher.add(1)
# 从1年级1班中删除id为1的老师
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
cls_obj.teachers.remove(1)
# 或者删除对象
teacher_obj = models.Teachers.filter(id=1)
cls_obj.teachers.remove(teacher_obj)
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
teachers_list = cls_obj.teachers.all()
3.聚合与分组
sum count avg max min
使用前需先导入聚合类,如下示例from django.db.models import Sum,Count,Max,Min,Avg
# 查看有多少学生
stu_count = models.Stuents.objects.all().aggregate(Count(‘id‘))
# 查询每个班级分配老师的数量
models.ClassInfo.objects.all().annotate(teacher_num=Count("teachers"))
文章标题:Django Web开发之model操作
文章链接:http://soscw.com/index.php/essay/67768.html