【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指定的名字進行查詢操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章