第四章:Model 数据层(2)

第一节:删除级联关系

处理删除关联数据 on_delete 可选参考

删除关系 代码 备注
连带删除 models.CASCADE 默认值,默认删除数据(后台管理的默认)
不给删 models.PROTECT 不存在关联时允许,否则不允许
删后为NULL models.SET_NULL 关联的数据为空,设置后可能要在后面添加blank=True,null=True
删后为默认 models.SET_DEFAULT 关联数据变回默认,但前提是字段有默认值,设置后可能要在后面添加default=5,blank=True,null=True
删除时动态指向一个实体 models.SET() 一般不用

定义级联关系

在这里插入图片描述定义完需要执行数据迁移

python manage.py makemigrations
python manage.py migrate

注意:多对多关系并没有级联关系的设定。删除数据尽量不能在后台管理删除,因为后台默认都是连带删除

例:尝试删除有级联关系的某用户
在这里插入图片描述

第二节:使用Manage模型

objects是什么

我们常常使用className.object进行数据的查询操作,那么什么是objects?它的类型是什么?还可以对它进行什么样的操作?

  • 1、objects的类型:<class 'django.db.models.manager.Manager'>

  • 2、objects是一个隐式属性
    在追源码时,我们发现,objects是在 models包下 manager.py里的一个Manager类,这个类空空如也,并未显示地定义objects,可见objects是隐式的、动态生成的、由 系统/框架根据需求,自动创建的 model.Manager 对象
    在这里插入图片描述

  • 3、当我们手动创建(重写)了Manager对象的时候,它就不会自动生成了

重写Manager

作用:配置默认的数据创建方式和查询方式,甚至还可以编写新的方法,增加新的功能

重写Manage,实现过滤

在这里插入图片描述

在对数据进行查询时,查询所有使用 objects.all() ,可以查询所有。追源码发现,all() 方法的返回值,其实就是 self.get_queryset(),因此,在定义新的objects时,可以重写 self.get_queryset() 的方法,使之默认逻辑过滤一些不想要的对象。那么在使用新的 newObjects.all() 时,便有了新的功能。

例1:默认过滤

添加“上帝”有户,用于过滤做准备
在这里插入图片描述
定义新的对象,重写方法,使之过滤
在这里插入图片描述
使用新的Manager对象替代object,依然可以使用原来object的所有方法。如:

例2:
在这里插入图片描述
在这里插入图片描述
执行结果:
在这里插入图片描述

重写Manage,实现简化添加用户

一般情况下,我们要在views.py定义一个路由函数,用于添加一个用户,那么正常的添加是需要创建一个用户对象,然后分别把用户的各个属性进行赋值,最后进行数据储存

例:
在这里插入图片描述
但是利用重写Manage时,可对其进行方法定义,实现简化添加用户,直接传参即可

例:
在这里插入图片描述在这里插入图片描述

第三节:使用Q对象实现复杂查询

“与”,“或”,"非"代码参考

删除关系 代码
条件"与" Q(条件语句) & Q(条件语句)
条件"或" Q(条件语句) | Q(条件语句)
条件"非" ~ Q(条件语句)
条件语句格式 属性名=值(忽略大小写)
属性名__运算符=临界值

使用Q对象实现"与",“或”,“非”

在这里插入图片描述在这里插入图片描述

第四节:数据模型的继承

元信息 Meta

元信息就是关于信息的信息,元信息允许服务器提供所发送数据的信息。Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。而可设置的选项大致有以下几个(比较常用的是前3个):

可设选项 说明
abstract 这个属性是定义当前的模型是不是一个抽象类。所谓抽象类是不会对应数据库表的。一般我们用它来归纳一些公共属性字段,然后继承它的子类可以继承这些字段。如果abstract = True这个model就是一个抽象类
db_table db_table是指定自定义数据库表名的。Django有一套默认的按照一定规则生成数据模型对应的数据库表名。数据库中生成的表名称 默认 app名称 + 下划线 + 类名
ordering 这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的。这是一个字符串的元组或列表,没有一个字符串都是一个字段和用一个可选的表明降序的’-‘构成。当字段名前面没有’-‘时,将默认使用升序排列。使用’?’将会随机排列
app_label 这个选型只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指定你这个模型是哪个应用程序的。
db_teblespace 定义这个model所使用的数据库表空间。如果在项目的settin中定义那么它会使用这个值
get_latest_by 在model中指定一个DateField或者DateTimeField。这个设置让你在使用model的Manager上的lastest方法时,默认使用指定字段来排序
managed 默认值为True,这意味着Django可以使用syncdb和reset命令来创建或移除对应的数据库。默认值为True,如果你不希望这么做,可以把manage的值设置为False
order_with_respect_to 这个选项一般用于多对多的关系中,它指向一个关联对象,就是说关联对象找到这个对象后它是经过排序的。指定这个属性后你会得到一个get_xxx_order()set_xxx_order()的方法,通过它们你可以设置或者回去排序的对象
permissions 主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。Django自动为每个设置了admin的对象创建添加,删除和修改的权限。
proxy 这是为了实现代理模型使用的,如果proxy = True,表示model是其父的代理 model
unique_together unique_together这个选项用于:当你需要通过两个字段保持唯一性时使用。比如假设你希望,一个Person的FirstName和LastName两者的组合必须是唯一的,那么需要这样设置:unique_together = (("first_name", "last_name"),),一个ManyToManyField不能包含在unique_together中。如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。
verbose_name erbose_name的意思很简单,就是给你的模型类起一个更可读的名字一般定义为中文,如verbose_name = "学校",如果不指定Django会自动在模型名称后加一个’s’

模型的继承

以下将创建新的应用 Zoo 作为案例加以说明

  • 1、前期准备
    在这里插入图片描述在这里插入图片描述
  • 2、定义继承模型
    例:
    例1与例2设置为不同的的元信息定义
    在这里插入图片描述
  • 3、执行数据迁移
python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

  • 4、定义路由及路由函数

在这里插入图片描述
在这里插入图片描述
执行结果:添加了两个汪星人,一个猫星人
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/86214219