乐趣区

关于django:四Django-model-操作

model 操作

model 罕用操作对应的就是数据库中的增删改查
参照文档 https://docs.djangoproject.co…

示例文件

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 查问数据

  • get 获取
# 获取 id 为 1 的学生
models.Students.objects.get(id='1')
  • filter 获取
# 查问 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=='伟')
  • all()查问所有
stu_list = models.Students.objects.all()  # 返回查问集,外面都是对象
  • vlaues
stu_list = models.Students.objects.values()   # 返回查问机,外面都是字典,不写字段,默认显示错有
  • vlaues_list
stu_list = models.Students.objects.values_list()   # 返回查问机,外面都是元组

1.3 批改数据

  • update
# 批改 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 类型 参数中写依据哪些字段进行排序。

all, filter, exclude, order_by 调用这些函数会产生一个查问集,QuerySet 类对象能够持续调用下面的所有函数。

查问集个性
1)惰性查问:只有在理论应用查问集中的数据的时候才会产生对数据库的真正查问。
2)缓存:当应用的是同一个查问集时,第一次应用的时候会产生理论数据库的查问,而后把后果缓存起来,之后再应用这个查问集时,应用的是缓存中的后果。
3) 能够对一个查问集进行取下标或者切片操作来限度查问集的后果,相似列表。对一个查问集进行切片操作会产生一个新的查问集,下标不容许为正数。

2 . 关联操作

2.1 一对多操作

学生和班级就是一对多关系,一个学生对应一个班级,一个班级则对应多个学生

通过学生,查找班级的 title

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

查问 1 年级 1 班的所有学生

cls_obj = models.ClassInfo.objects.filter(title='1 年级 1 班')
stu_list = cls_obj.students_set.all()

2.2 多对多操作

create

# 为 1 年级 1 班新建一名老师
cls_obj = models.ClassInfo.objects.filter(title='1 年级 1 班')
cls_obj.teachers.create(name='张老师')

add

# 指派 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)

删除 remove

# 从 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)  

查问 1 年级 1 班的老师

cls_obj = models.ClassInfo.objects.filter(title='1 年级 1 班')
teachers_list = cls_obj.teachers.all()

3. 聚合与分组

聚合

聚合操作蕴含如下:
sum count avg max min

aggregate:调用这个函数来应用聚合。返回值是一个字典
应用前需先导入聚合类,如下示例

from django.db.models import Sum,Count,Max,Min,Avg
# 查看有多少学生
stu_count = models.Stuents.objects.all().aggregate(Count('id'))  

分组

分组应用 annotate()

# 查问每个班级调配老师的数量
models.ClassInfo.objects.all().annotate(teacher_num=Count("teachers"))
退出移动版