模型的基本概念
模型是您的数据唯一而且准确的信息来源。它包含您正在储存的数据的重要字段和行为。一般来说, 每一个模型都映射一个数据库表。每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
模型的具体定义方式
class Person(models.Model):
name = models.CharFiled(max_length=20)
age = models.CharFiled(max_length=5)
上述代码中定义了一个Person的模型 其中有两个字段一个name一个是age这两个字段都是**CharFiled()**类型的也就是字符类型,必须定义好最大长度
模型具体属性
- AutoField()自增长类型,只有主键才可以设置
- CharField()字符串类型
- IntergerField() 整形
- FloatField() 浮点形
- DecimalField() 浮点型 , 可以设置显示的位数
DecimalField(max_digits=4) 设置了总长度为四
DecimalField(decimal_places=2) 设置了小数点后两位
- BooleanField() 布尔类型
- DateField() 日期类型
auto_now=True 每次保存对象是都会更新当前时间
-TimeField()
-DateTimeField() 用法类似
约束
- null 设置null=True可以为空,null=False不能为空
- primary_key 设置True标识为主键
- unique 设置True唯一标示
- db_colum 设置字段名,没指定属性名即为字段名
- db_index 设置为索引
- blank 设置为True,表示可以为空白
一对一 、一对多、 多对多
这些关系都是在从表中来做声明
- OneToOneField()
如人和身份证就是一对一的关系 本质上还是使用的ForeignKey()只是加上了唯一约束,一般我们把人设置为主表,身份证设置为从表
一对一主从表查询
#人删除身份证也删除
r_person = OneToOneField(Person,on_delete=models.CASECODE)
# 通过身份证查找到人
id = IdCard.objects.last()
person = id.r_person
# 通过人查到身份证
person = Person.objects.last()
# 注意此处要使用从表名的小写形式来查询到从表
id = person.idcard
- ForeignKey()
如班级和学生 一个班级有多个学生,一个学生只能对应一个班级,班级是主表,学生是从表
一对多主从表查询
# 主表查从表
clas = Clas.objects.last()
# student_set 是类名小写加set的格式
# 获取到和该班级相关的所有学生信息
# student_set 和objects是相同的用法,可以加筛选条件等等
stu = clas.student_set.all()
# 从表查主表
stu = Student.objects.last()
clas = stu.r_clas
- ManyToManyField()
如课程和学生,一个学生选择多门课,一个课程可以被多名学生选择
会建立第三方表,用来存储学生和课程的关系,
# 主表获取从表
course = Course.objects.last()
# 和一对多的主获取从是一样的用法
stus = course.student_set.all()
# 从表获取主表
stu = Student.objects.last()
# 此处的r_course和objects也是相同的用法
courses = stu.r_course.all()
on_delete的属性
1. models.PROTECT 设置为保护模式如果删除主表数据,关系到从表会报错
2. models.CASECODE 这是默认模式,表示连级删除
3. models.SET_NULL 表示将从表数据置空
4. models.SET_DEFAULT 这个要为该字段先设置一个默认值然后才能启用
模型元选项
在模型类里面定义一个Meta类
class Meta:
# 设置迁移后的表名
db_table="Person"
# 表示该类的是一个抽象类, 一般用在父类中,抽象类迁移不会生成表
# 如果不设置,继承的类生成的表不会有父类的字段
abstract=True
# 设置的是在数据库中的排序方式,按name字段排序
ordering=["name"]
自定义模型管理器
一般我们在实际的开发中都不会删除数据,所以我们给表会定义一个字段isdelete用来判断这条数据是否是有效isdelete =BooleanField(default=False)这样就会出现一个问题我们在试图中使用如 Student.objects.all()会获取到所有的信息但是如何能只获取到isdelete只为False的一部分呢
- objects其实只是一个模型管理器,继承于models.Manager
- 我们只需要自定义一个模型管理器就可以实现只获取一部分数据了我们只需要自定义一个模型管理器就可以实现只获取一部分数据了
- 模型管理类的编写在models.py文件中
class Myobjects(models.Manager)
# 我们重写父类的all方法
def all(self):
# 调用父类方法,在父类方法基础上进行再次过滤
return super().filter(isdelete=False)
在模型类中添加上Myobjects类的实例化对象
objects = Myobjects()
之后你在views.py中直接使用
Student.objects.all()得到的就是过滤后的数据也就是isdelete=False的数据