You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:05:13