【Django】省市區三級聯動自關聯表的分析
阿新 • • 發佈:2018-12-16
什麼是省市區三級聯動?
在收貨地址的錄入,考試考區的選擇…等場景中都會用到省市區三級聯動,即:頁面載入後,向後端請求省份資料,使用者選擇省份後,向後端請求該省份的市級資訊,當用戶選擇市級後,向後端請求該市下的所有區縣資訊,我們把這個過程稱為省市區三級聯動。
如圖:
自關聯表的形式
- 以河北省舉例,所有的省市區縣資訊全在一張表中,id為自增id,name為城市名,parent_id為關聯外來鍵
- 省級為最高,所以河北省外來鍵為None,市級的外來鍵為該市所對應的省的id,石家莊市在河北省之下,所以外來鍵為河北省的id,區縣一級的外來鍵為該區縣所屬的市的id,如,無極縣和新華區都是石家莊市下的區縣,所以關聯外來鍵為石家莊市的id。
- 在資料庫中的具體體現:
資料庫建表的一些問題:
在models中
class Area(models.Model):
"""
行政區劃
"""
name = models.CharField(max_length=20, verbose_name='名稱')
parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上級行政區劃')
class Meta:
db_table = 'tb_areas'
verbose_name = '行政區劃'
verbose_name_plural = '行政區劃'
def __str__(self):
return self.name
- “self”的含義
自關聯欄位的外來鍵指向自身,所以ForeignKey(‘self’) - related_name='subs’的含義
通過電影和電影中角色表來理解:
首先,有兩個表:Movie(電影),Role(角色)
Class Movie():
btitle = ...
Class Roles():
movie = models.ForeignKey('Movie', on_delete=models.SET_NULL, related_name='people', null=True, blank=True)
現在,查詢電影下所有角色:
- 沒有設定related_name=‘pelple’,查詢方式為:
movie.roles_set.all() 即:使用Django預設的Movie模型類物件.父表名的小寫_set語法。 - 設定了related_name=‘people’,查詢方式為:
movie.people.all() 即:直接用related_name指定的名字進行查詢操作
以上是個人對自關聯表的理解,如有問題,還請不吝賜教。