接上篇内容,本篇我们继续介绍Django模型数据操作。
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。aggragate返回的是一个字典类型,格式如:{‘聚合类小写__属性名’:值}
查询用户的平均年龄
from beardata_sys.models import User
from django.db.models import Avg
user_dict = User.objects.aggregate(Avg('age'))
user_dict
from beardata_sys.models import User
from django.db.models import Avg
user_count = User.objects.count()
user_count
查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句,默认Django返回的数据limit 21。
查询用户表中前2条数据
from beardata_sys.models import User
user_list = User.objects.all()[0:2]
user_list
ForeignKey:一对多,将字段定义在多的一端中。
ManyToManyField:多对多,将字段定义在任意一端中。
OneToOneField:一对一,将字段定义在任意一端中。
由一到多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set
例:
from beardata_sys.models import Role
role = Role.objects.get(id=1)
user_list = role.user_set.all()
user_list
多对应的模型类对象.多对应的模型类中的关系类属性名
例:
from beardata_sys.models import User
user = User.objects.get(id=1)
role = user.user_role
role
语法:关联模型类名小写__属性名__条件运算符=值
根据查询用户描述中包含beardata的用户
from beardata_sys.models import Role
user_list = Role.objects.filter(user__remark__contains='beardata')
user_list
语法:一模型类关联属性名__一模型类属性名__条件运算符=值
查询角色为 “admin”得所有用户列表
from beardata_sys.models import User
user_list = User.objects.filter(user_role__name='admin')
user_list
Django除了提供自带的数据库操作API外,还支持直接执行原生的SQL语句。
语法
模型类.objects.raw(SQL语句)
查询User列表
from beardata_sys.models import User
user_list = User.objects.raw("SELECT * FROM beardata_sys_user")
user_list[0]
from beardata_sys.models import User
name = "beardata"
user_list = User.objects.raw("SELECT * FROM beardata_sys_user WHERE name = %s",[name])
user_list[0]
在Django中模型属性objects:是models.Manager类型的对象,用于与数据库进行交互。
当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。
为模型类User定义管理器user_manager语法如下:
class User(models.Model):
...
user_manager = models.Manager()
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager。在后续使用中不能再使用Django自带得objects管理器了,只能使用自定义得管理器。
自定义管理器类主要用于两种情况:
1.修改原始查询集,如重写all()方法
2.向管理器类中添加额外的方法,如向数据库中插入数据。
1.修改原始查询集,重写all()方法(为了演示,我们查询年龄大于20的用户)。
(1). 打开beardata_sys/models.py,定义UserManager类
class UserManager(models.Manager):
"""自定义用户管理器类"""
def all(self):
return super().all().filter(age__gt=20)
(2). 在User类中定义管理器
# 自定义管理器
user_manager = UserManager()
2.在管理器类中定义创建对象的方法
对模型类对应的数据表进行操作时,推荐将这些操作数据表的方法封装起来,放到模型管理器类中。
(1) 打开beardata_sys/models.py
class UserManager(models.Manager):
"""自定义用户管理器类"""
........
def create_user(self, id, name, password, age, sex, remark, user_role):
user = self.model()
user.id = id
user.name = name
user.password = password
user.age = age
user.sex = sex
user.remark = remark
user.user_role = user_role
user.save()
return user
在模型类中定义类Meta,用于设置元信息,如使用db_table自定义表的名字。
数据表的默认名称为:
_
例:
beardata_sys_user
指定User模型类生成的数据表名为t_user
在User模型类中添加如下内容,代码如下:
class Meta:
"""定义元选项"""
db_table = "t_user"