文章目录
第一节:删除级联关系
处理删除关联数据 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、定义路由及路由函数
执行结果:添加了两个汪星人,一个猫星人