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)