【006】- Django模型数据操作(二)

接上篇内容,本篇我们继续介绍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

【006】- Django模型数据操作(二)_第1张图片
查询用户总数

from beardata_sys.models import User
from django.db.models import Avg
user_count = User.objects.count()
user_count

【006】- Django模型数据操作(二)_第2张图片

查询集

查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。

返回查询集的过滤器
  1. all():返回所有数据
  2. filter():返回满足条件的数据
  3. exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
  4. order_by():对结果进行排序
  5. annotate():聚合,返回查询集,并新添字段
返回单个值的过滤器
  1. get():返回单个满足条件的对象
    如果未找到会引发"模型类.DoesNotExist"异常
    如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
  2. count():返回当前查询结果的总条数
  3. aggregate():聚合,返回一个字典
判断某一个查询集中是否有数据

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

【006】- Django模型数据操作(二)_第3张图片

关联

关系字段类型

ForeignKey:一对多,将字段定义在多的一端中。
ManyToManyField:多对多,将字段定义在任意一端中。
OneToOneField:一对一,将字段定义在任意一端中。

由一到多的访问语法:

一对应的模型类对象.多对应的模型类名小写_set
例:
from beardata_sys.models import Role
role = Role.objects.get(id=1)
user_list = role.user_set.all()
user_list

【006】- Django模型数据操作(二)_第4张图片
由多到一的访问语法:

多对应的模型类对象.多对应的模型类中的关系类属性名
例:
from beardata_sys.models import User
user = User.objects.get(id=1)
role = user.user_role
role
【006】- Django模型数据操作(二)_第5张图片

由多模型类条件查询一模型类数据:

语法:关联模型类名小写__属性名__条件运算符=值

根据查询用户描述中包含beardata的用户

from beardata_sys.models import Role
user_list = Role.objects.filter(user__remark__contains='beardata')
user_list

【006】- Django模型数据操作(二)_第6张图片

由一模型类条件查询多模型类数据

语法:一模型类关联属性名__一模型类属性名__条件运算符=值

查询角色为 “admin”得所有用户列表

from beardata_sys.models import User
user_list = User.objects.filter(user_role__name='admin')
user_list

【006】- Django模型数据操作(二)_第7张图片

执行原生SQL

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]

【006】- Django模型数据操作(二)_第8张图片
查询名称为 “beardata” 的用户

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]

【006】- Django模型数据操作(二)_第9张图片

模型类扩展

在Django中模型属性objects:是models.Manager类型的对象,用于与数据库进行交互。
当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。

为模型类User定义管理器user_manager语法如下:

class User(models.Model):
    ...
    user_manager = models.Manager()
管理器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()

【006】- Django模型数据操作(二)_第10张图片

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"

你可能感兴趣的:(Python)