Django数据库关系

1. 在模型映射时,模型的任意字段发生改变,都要进行重新迁移(迁移表名的定义)

1.1 指定db_table参数,表示模型迁移时,映射到数据库中的表名称

1.2 如果没有指定db_table,则默认的表名称是app名字_模型类名称

2. 字段类型(与关系型数据库相匹配)

CharField:字符串类型
IntegerField:整型
ImageField:字符串类型,用于存储图片
BooleanField:布尔,True或者False
DateTimeField:日期,年月日,时分秒
DateField:年月日
TextField:存储长文本内容,textarea标签
FloatField:浮点类型
DecimalField:浮点类型,限制最大长度,和小数点后的长度

3. 约束

约束

说明:models.CASCADE删除主表,从表数据也会跟着被删 models.PROTECT 不让删除主表 models.SET_NULL 当主表数据删除时,从表的外键设置为NULL

4.一对一:OneToOne

4.1 定义模型 (说明模型中,学生与学生拓展信息是一对一的关系,关联字段在拓展表中)

OneToOneField:定义在关联模型的任何一方

4.2 存储(定义了键的一方可以通过实例.关联字段得到另一关联对象)

方式一:stu_info.关联字段 = 关联对象---> stu_info.stu = Student.objects.get(id=5)

方式二:stu_info.关联字段_id = 主键id值 ---> stu_info.stu_id = 3

4.3 查询

查询一:没有设置related_name参数

学生对象查询拓展对象;学生对象.拓展表的小写

stu = Student.objects.filter(s_name='小明').first()

利用一对一关联模型对象,关联另一个模型的名称的小写

stu_info = stu.studentinfo

拓展表对象查询学生对象;拓展对象.OneToOneField定义的字段

info = StudentInfo.objects.filter(s_no='789').first()

stu = info.stu

查询二,设置了related_name参数

拓展表对象查询学生对象:拓展表对象.OneToOneField定义的字段

stu = Student.objects.filter(s_name='小明').first()

stu_info = stu.info

拓展表对象查询学生对象;拓展对象.OneToOneField定义的字段

info = StudentInfo.objects.filter(s_no='789').first()

stu = info.stu

4.4 删除

删除主表数据,从表数据应该如何反应,取决于关联字段中的on_delete值

定义了关联字段的表是从表,另一个表是主表

Student.objects.filter(s_name='日向雏田').delete()

5. 一对多:ForeignKey

5.1 定义模型:

ForeignKey该字段定义在一对多中,并且在多的一方定义.

5.2 存储

stu = Student.objects.get(pk=1)

分配: 方式一

stu.g = Grade.objects.get(pk=1)

分配: 方式二

stu.g_id = 1

stu.save()

5.3 查询

查询一:没有定义related_name的参数

学生查询班级:多的一方对象.关联字段

stu = Student.objects.filter(s_name='日向雏田').first()

stu_grade = stu.g

班级查询学生:一的一方对象.关联模型名的小写_set

grade = Grade.objects.get(pk=2)

grade_stu = grade.student_set.all()

查询二:定义了related_name参数

学生查询班级:多的一方对象.关联字段

stu = Student.objects.filter(s_name='日向雏田').first()

stu_grade = stu.g

班级查询学生:一的一方对象.related_name的参数值

grade = Grade.objects.get(pk=2)

grade_stu = grade.stu.all()

print(grade_stu.filter(pk=3).first())

5.4 删除

对象实例.delete()

6. 多对多:ManyToMany

6.1 定义模型(下列关联字段定义在课程中)

ManyToManyField:定义在模型的任何一方都可以

6.2 存储

给学生添加课程

stu.course_set.add(course)

设置了related_name参数,course是一个对象实例

stu.cou.add(course)

课程安排学生

course.stu.add(stu)

6.3 查询

查询一:没有设置related_name参数

课程查询学生:

课程对象.关联字段.all().filter(条件)

course.stu.all().filter(条件)

学生查询课程:

学生对象.关联模型名的小写_set

stu.course_set.all().filter(条件)

查询二:设置了related_name参数

课程查询学生:

课程对象.关联字段.all().filter(条件)

course.stu.all().filter(条件)

学生查询课程:学生对象.related_name参数值.all().filter(条件)

stu.cou.all().filter()

6.4 删除

拿到对象集合.remove(对象实例)

stu.cou.remove(course) # 删除课程

你可能感兴趣的:(Django数据库关系)