Django PolymorphicQuerySet无provisioning_set属性报错原因问询
报错原因
site.terminal_set 返回的是 PolymorphicQuerySet 类型的查询集合对象,代表和当前Site关联的所有Terminal实例的集合,而非单个Terminal模型实例。
反向关联属性 provisioning_set 是单个Terminal实例才拥有的属性,仅作用于单条数据对象,不属于查询集合的内置属性,因此直接在查询集合上调用该属性会触发属性不存在的报错。
正确查询写法
根据不同的使用场景,可以选择对应的写法:
- 场景1:查询当前Site关联的所有Provisioning实例(推荐,单次查询效率最高)
# 直接跨外键正向过滤 provisioning_list = Provisioning.objects.filter(terminal__site=site) # 取第一个实例的写法 first_provisioning = Provisioning.objects.filter(terminal__site=site).first()
- 场景2:需要遍历当前Site下每个Terminal对应的所有Provisioning
# 先遍历查询集合拿到单个Terminal实例,再调用反向关联 for terminal in site.terminal_set.all(): current_provisionings = terminal.provisioning_set.all() # 执行对应业务逻辑
内容的提问来源于stack exchange,提问作者Cido
相关产品推荐
相关产品推荐

