Model(表设计)
在这里只提经常用到的三种联表结构:
- 一对多:models.ForeignKey(其他表)
- 多对多:models.ManyToManyField(其他表)
- 一对一:models.OneToOneField(其他表)
一、联表结构一对多
一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
先来看django models里面是怎么写的:
1 class Color(models.Model):
2
3 name = models.CharField(max_length=15)
4
5
6 class Someting(models.Model):
7
8 c1 = models.CharField(max_length=15)
9 c2 = models.CharField(max_length=15)
10 c3 = models.CharField(max_length=15)
11 c4 = models.CharField(max_length=15)
12 color = models.ForeignKey(Color) #设置外键为另一个类名
13
14
15 class Host(models.Model):
16 hostname = models.CharField(max_length=15)
17 business = models.ForeignKey('Business') #用引号的方式是避免外键的类在下面而导致的报错
18
19
20 class Business(models.Model):
21 name = models.CharField(max_length=15)
在数据库中的两张表,可以看到设置外键的那列关联到了另一张表上的id列:
color表:
something表:
同样也可以有选择性的关联另一张表中的数据:
参数:to_field=“”
1 class Shoplist(models.Model):
2
3 name = models.CharField(max_length=15, null=True, unique=True) #必须要设置unique = True,(不能重复)
4 price = models.CharField(max_length=15)
5
6
7 class Shop(models.Model):
8
9 v1 = models.CharField(max_length=15)
10 v2 = models.CharField(max_length=15)
11 pr = models.ForeignKey(Shoplist, to_field='name')
二、联表结构多对多
一张图诠释了多对多的含义:
在django中的models里:
1 class Group(models.Model):
2
3 groupname = models.CharField(max_length=15)
4
5
6 class User(models.Model):
7
8 name = models.CharField(max_length=15)
9 email = models.CharField(max_length=15)
10 phone = models.CharField(max_length=15)
11 group = models.ManyToManyField(Group) #与表Group创建多对多的关联
在这里我们不需要专门创建第三张关联的表,django自动就为我们创建了第三张表:
三、联表结构一对一
django中的一对一表结构可以理解为在多对多的基础上建立的,只不过绑定的表对象里的数据只能出现一次:
由上图理解,表A与表B建立了一对一的结构。(B建立了与A的一对一),那么表A中的数据在表B中只能出现一次。
在django的model里:
1 class User2(models.Model):
2
3 name = models.CharField(max_length=15)
4 email = models.CharField(max_length=15)
5 phone = models.CharField(max_length=15)
6
7
8 class Group2(models.Model):
9
10 groupname = models.CharField(max_length=15)
11 group = models.OneToOneField(User2)