【Django】省市区三级联动自关联表的分析

什么是省市区三级联动?

在收货地址的录入,考试考区的选择…等场景中都会用到省市区三级联动,即:页面加载后,向后端请求省份数据,用户选择省份后,向后端请求该省份的市级信息,当用户选择市级后,向后端请求该市下的所有区县信息,我们把这个过程称为省市区三级联动。
如图:【Django】省市区三级联动自关联表的分析

自关联表的形式

【Django】省市区三级联动自关联表的分析

  • 以河北省举例,所有的省市区县信息全在一张表中,id为自增id,name为城市名,parent_id为关联外键
  • 省级为最高,所以河北省外键为None,市级的外键为该市所对应的省的id,石家庄市在河北省之下,所以外键为河北省的id,区县一级的外键为该区县所属的市的id,如,无极县和新华区都是石家庄市下的区县,所以关联外键为石家庄市的id。
  • 在数据库中的具体体现:
    【Django】省市区三级联动自关联表的分析

数据库建表的一些问题:

在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指定的名字进行查询操作

以上是个人对自关联表的理解,如有问题,还请不吝赐教。