Django模型关联查询:无需外键获取学校所属省份及相关查询
Django 关联模型跨表查询实现方案
先提醒下你的模型存在语法问题:Province和District类的__str__方法未使用self调用字段,运行时会抛出NameError,修正后的代码片段:
class Province(models.Model): province = models.CharField(max_length=20, blank=False, null=False) def __str__(self): return self.province class District(models.Model): district = models.CharField(max_length=20, blank=False, null=False) province = models.ForeignKey('Province', related_name='district_province', on_delete=models.CASCADE) def __str__(self): return self.district
以下是针对你需求的具体实现方案:
1. 查询学校时同时获取所属区县和省份信息
使用Django ORM的select_related()方法,一次性关联查询外键关联的表数据,避免多次数据库查询(N+1问题),示例代码:
# 查询所有学校并关联区县、省份数据 schools = School.objects.select_related('district', 'district__province').all() # 遍历提取数据 for school in schools: print(f"学校名称:{school.school}") print(f"所属区县:{school.district.district}") print(f"所属省份:{school.district.province.province}")
若只需查询单个学校,将.all()替换为.get(pk=目标学校ID)即可。
2. 获取指定ID(如ID=2)的省份下的所有学校
提供两种简洁实现方式:
方式一:反向关联链式查询
利用Province模型的related_name反向获取该省份下的所有区县,再筛选对应区县的学校:
target_province = Province.objects.get(pk=2) schools_in_province = School.objects.filter(district__in=target_province.district_province.all())
方式二:跨表双下划线直接查询
Django ORM支持双下划线__跨表查询,直接通过School的外键链到Province:
schools_in_province = School.objects.filter(district__province__pk=2)
这种写法更简洁,推荐使用。
内容的提问来源于stack exchange,提问作者Isaac Hatilima
相关产品推荐
相关产品推荐

