django - 模型 - 关联关系
一、一对一 (OneToOne)
-
MySQL:一对一 建表
-
外键
create table t_user( id int primary key auto_increment , .... ); create table t_user_info ( id int primary key auto_increment , ... user_id int unique , contraint 外键名 foreign key(user_id) references t_user(id) )
-
共享主键
create table t_user( id int primary key auto_increment , .... ); create table t_user_info ( id int primary key , ... contraint 外键名 foregin key(id) references t_user(id) )
-
-
django 模型:定义一对一的关联关系 (OneToOneField)
stu = models.OneToOneField(to=Student, on_delete=models.CASCADE, blank=True)
OneToOne的操作
stu = Student.objects.create(name="", …)
Computer.objects.create(name=“电脑”, stu=stu)
二、多对一 (ManyToOne)
-
MySQL:在 多 的一方维护 一 的一方的关系
-
django 模型:
school = models.ForeignKey(to=School, on_delete=models.CASCADE , blank=True, null=True)
ManyToOne的操作
school = School.objects.create(name=“xxx”)
stu = Student.objects.create(name…, school=school)
三、多对多 (ManyToMany)
-
MySQL:多对多维护关系,中间表维护关系
create table t_student( ... ) create table t_teacher( ... ) create table t_teacher_student( tea_id int , stu_id int , primary key(tea_id , stu_id) ) create table t_teacher_student( int int primary key auto_increment , tea_id int , stu_id int , );
-
django 模型:
students = models.ManyToManyField(to=Student, db_table="中间表表名", blank=True)
ps:中间表默认建表的规则是应用名_类名_关系属性名
,表中关系字段的名字为模型名小写_id
,并在中间表中,存在一个主键 id 字段。
ManyToMany 的操作
teacher = Teacher.objects.create(name=“xx”)
queryset = Student.objects.all()
teacher.students.set(queryset)