Django一对多外键场景下如何筛选存在出发或到达路线关联的城市
问题原因
你的查询结果不符合预期的核心原因是反向关联名使用错误:你在Route模型中定义两个指向City的外键时,分别自定义了related_name参数为leaving_from和destination,因此City反向查询关联路线时,需要使用你自定义的关联名,而非默认的route前缀。你原来的写法中使用的关联路径route__leaving_from不存在,导致查询条件失效,才会返回不符合预期的结果。
正确写法
写法1:使用Q条件查询
直接通过自定义的反向关联名判断城市是否有关联的出发/目的地路线即可:
from django.db.models import Q related_cities = City.objects.filter( Q(leaving_from__isnull=False) | Q(destination__isnull=False) ).distinct()
写法2:ID集合匹配(可读性更高)
先提取所有路线的出发地、目的地ID,合并去重后直接查询对应城市,适合数据量不大的场景:
# 提取所有路线的出发地、目的地ID from_city_ids = Route.objects.values_list('leaving_from_id', flat=True) to_city_ids = Route.objects.values_list('destination_id', flat=True) # 合并去重后查询 all_related_ids = set(list(from_city_ids) + list(to_city_ids)) related_cities = City.objects.filter(id__in=all_related_ids)
内容的提问来源于stack exchange,提问作者eba alemayhu
相关产品推荐
相关产品推荐

