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

  • Post author:
  • Post category:其他




什么是省市区三级联动?



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


如图:
京东购物车结算的地址选择在这里插入图片描述



自关联表的形式

在这里插入图片描述


  • 以河北省举例,所有的省市区县信息全在一张表中,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指定的名字进行查询操作


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



版权声明:本文为u013034226原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。