Django Models
字段
|
|
数据库表关系
- 一对多,models.ForeignKey(A)
当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择) - 一对一,models.OneToOneField(B)
在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失) - 多对多,authors = models.ManyToManyField(C)
在某表中创建一行数据是,有一个可以多选的下拉框
模型的属性
objects 模型最重要的属性是Manager。它是Django 模型进行数据库查询操作的接口,并用于从数据库获取实例。如果没有自定义Manager,则默认的名称为objects。Managers 只能通过模型类访问,而不能通过模型实例访问;也可以自定义方法;
模型的方法
可以在模型上定义自定义的方法来给你的对象添加自定义的“底层”功能。Manager 方法用于“表范围”的事务,模型的方法应该着眼于特定的模型实例。
管理器方法可以通过self.model 来得到它所属的模型类
get()/filter()区别
- models.objects.get() 获取到的是一个对象,如果没有抛出DoesNotExist异常;
- get()得到的对象,更新需要obj.name=name, obj.save()
- models.objects.filter()数据过滤,得到是一个查询集-对象列表,如果没有返回[]
- filter()得到的对象,更新时直接models.objects.filter().update()
model.object.create()/model.save()区别
|
|
模型继承
抽象基类
只想使用父类来持有一些信息,不想在每个子模型中都定义一次,这个类永远不会单独使用
编写完基类之后,在 Meta类中设置 abstract=True ,该类就不能创建任何数据表,如果抽象化基础类和它的子类有相同的项,那么将会出现error(并且Django将返回一个exception),例子如下:
在 ForeignKey或 ManyToManyField字段上使用 related_name属性,你必须总是为该字段指定一个唯一的反向名称
多表继承
继承一个已经存在的模型且想让每个模型具有它自己的数据库表
代理继承
只是想改变模块Python 级别的行为,而不用修改模型的字段,更改默认的manager,或者添加一个新的方法;为原始模型创建一个代理,你可以创建,删除,更新代理 model 的实例,而且所有的数据都可以像使用原始 model 一样被保存
不同之处在于:你可以在代理 model 中改变默认的排序设置和默认的 manager ,更不会对原始 model 产生影响
多对多表结构中添加字段
|
|
|
|
关联对象查询
|
|
一对多关系
正向查询
反向查询
多对多关系
多对多关系的两端都会自动获得访问另一端的API。这些API 的工作方式与一对多关系一样
一对一关系
正向查询
反向查询
select_for_update()
|
|
批量创建
使用django.db.models.query.QuerySet.bulk_create()批量创建对象,减少SQL查询次数
执行原始sql
在模型查询API不够用的情况下,你可以使用原始的SQL语句