1. 程式人生 > >【Django】省市區三級聯動自關聯表的分析

【Django】省市區三級聯動自關聯表的分析

什麼是省市區三級聯動?

在收貨地址的錄入,考試考區的選擇…等場景中都會用到省市區三級聯動,即:頁面載入後,向後端請求省份資料,使用者選擇省份後,向後端請求該省份的市級資訊,當用戶選擇市級後,向後端請求該市下的所有區縣資訊,我們把這個過程稱為省市區三級聯動。
如圖:京東購物車結算的地址選擇在這裡插入圖片描述

自關聯表的形式

在這裡插入圖片描述

  • 以河北省舉例,所有的省市區縣資訊全在一張表中,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)

現在,查詢電影下所有角色:

  1. 沒有設定related_name=‘pelple’,查詢方式為:
    movie.roles_set.all() 即:使用Django預設的Movie模型類物件.父表名的小寫_set語法。
  2. 設定了related_name=‘people’,查詢方式為:
    movie.people.all() 即:直接用related_name指定的名字進行查詢操作

以上是個人對自關聯表的理解,如有問題,還請不吝賜教。