Django--models连表构建 需求 速查 知识点 详细1、一对多--ForeignKey1.1 默认连接id字段models.py1234567class Gender(models.Model): gender = models.CharField(max_length=2) class User(models.Model): name = models.CharField(max_length=10) age = models.IntegerField() gender = models.ForeignKey(Gender)cmd
models多表(一对多、多对多、一对一)的构建
速查
1、一对多
1
2
3
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
gender
=
models.ForeignKey(外键表名,to_field
=
"连接的字段"
)
2、多对多
1
2
3
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
hobby
=
models.ManyToManyField(Hobby)
3、一对一
1
2
3
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
salary
=
models.OneToOneField(Salary,to_field
=
"name"
)
知识点
1、连表结构
一对多:models.ForeignKey(其他表),A表的一个字段对应B表的多个字段;
多对多:models.ManyToManyField(其他表),A表中的一个字段对应B表中的多行(自动创建一关系表);
一对一:models.OneToOneField(其他表),
2、应用场景
一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。多对多:在某表中创建一行数据时,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个爱好一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
详细1、一对多--ForeignKey
1.1 默认连接id字段
models.py
1
2
3
4
5
6
7
class
Gender(models.Model):
gender
=
models.CharField(max_length
=
2
)
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
age
=
models.IntegerField()
gender
=
models.ForeignKey(Gender)
cmd
1
2
3
4
5
6
7
class
Gender(models.Model):
gender
=
models.CharField(max_length
=
2
)
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
age
=
models.IntegerField()
gender
=
models.ForeignKey(Gender)
Django--path > python manager.py makemigrations
Django--path > python manager.py migrate
db--gender表
db--user表
1.2 连接不是id的字段
外键列,默认是用id来连接,这个字段名称自动改为“xx_id”列,如果使用某个字段连接,需要参数to-field:"连接的字段";
models.py
1
2
3
4
5
6
7
class
Salary(models.Model):
name
=
models.CharField(max_length
=
10
,unique
=
True
)
salary
=
models.IntegerField()
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
age
=
models.IntegerField()
salary
=
models.ForeignKey(Salary,to_field
=
"name"
)
db--salary(薪资)表
db--user表
2、多对多--ManyToManyField
models.py
1
2
3
4
5
6
class
Hobby(models.Model):
hobby
=
models.CharField(max_length
=
10
)
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
age
=
models.IntegerField()
hobby
=
models.ManyToManyField(Hobby)
db--hobby(爱好)表
db--user表
user表中并没有创建hobby列,而是新建了一张表,记录了他们的对应关系。
db--user_hobby
3、一对一--OneToOneField
外键的表每行只能被选择一次
models.py
1
2
3
4
5
6
7
8
class
Salary(models.Model):
name
=
models.CharField(max_length
=
10
,unique
=
True
)
salary
=
models.IntegerField()
class
User(models.Model):
name
=
models.CharField(max_length
=
10
)
age
=
models.IntegerField()
salary
=
models.OneToOneField(Salary,to_field
=
"name"
)