什麼是省市區三級聯動?
在收貨地址的錄入,考試考區的選擇…等場景中都會用到省市區三級聯動,即:頁面加載後,向後端請求省份數據,用戶選擇省份後,向後端請求該省份的市級信息,當用戶選擇市級後,向後端請求該市下的所有區縣信息,我們把這個過程稱爲省市區三級聯動。
如圖:
自關聯表的形式
- 以河北省舉例,所有的省市區縣信息全在一張表中,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指定的名字進行查詢操作
以上是個人對自關聯表的理解,如有問題,還請不吝賜教。