什么是省市区三级联动?
在收货地址的录入,考试考区的选择…等场景中都会用到省市区三级联动,即:页面加载后,向后端请求省份数据,用户选择省份后,向后端请求该省份的市级信息,当用户选择市级后,向后端请求该市下的所有区县信息,我们把这个过程称为省市区三级联动。
如图:
自关联表的形式
-
以河北省举例,所有的省市区县信息全在一张表中,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指定的名字进行查询操作
以上是个人对自关联表的理解,如有问题,还请不吝赐教。
版权声明:本文为u013034226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。