Django:如何通过非直接关联模型筛选获取Person对象?
解决Django中通过State_Schedules关联获取Person对象的简洁方法
嗨,我完全懂你之前绕着Person_Address层层查询的繁琐感!其实Django的ORM自带了跨表关联查询的便捷特性,不用手动走弯路,直接一步就能拿到你要的Person对象。
核心思路
利用Django ORM的双下划线(__)关联查询特性,直接串联Person → Person_Address → State_Schedules的关联关系,结合你已有的contactables()查询集做过滤即可。
具体实现方法
方法1:提取有效state集合后过滤(直观易懂)
# 从已过滤好的State_Schedules查询集中,提取所有符合条件的state值 valid_states = contactables().values_list('state', flat=True) # 直接查询Person:只要其关联的Person_Address的state在有效集合内 target_people = Person.objects.filter(person_address__state__in=valid_states).distinct()
person_address__state:通过双下划线直接跨到Person关联的Person_Address模型的state字段.distinct():避免一个Person对应多个Person_Address时,查询结果出现重复的Person对象
方法2:使用子查询(性能更优)
如果数据量较大,想减少数据库查询次数,用子查询合并请求更高效:
from django.db.models import Subquery valid_schedules = contactables() target_people = Person.objects.filter( person_address__state__in=Subquery(valid_schedules.values('state')) ).distinct()
这种方式会把两次查询合并为一次数据库请求,性能表现更好。
优化小技巧
要是你给Person_Address的ForeignKey设置related_name,比如:
class Person_Address(models.Model): # ...其他字段 person = models.ForeignKey(Person, related_name='addresses')
那查询语句会更直观:
target_people = Person.objects.filter(addresses__state__in=valid_states).distinct()
这样是不是比你之前的繁琐操作清爽多了?
内容的提问来源于stack exchange,提问作者Onilol
相关产品推荐
相关产品推荐

