Django:修复QuerySet调用@property报错并实现属性条件过滤
修复Django模型中QuerySet无star属性的错误
错误原因
你用filter()获取父级对象时,返回的是QuerySet集合,而非单个Individus实例,集合本身没有定义star属性,所以会抛出'QuerySet' object has no attribute 'star'错误。
修复方案
把获取父对象的方式从filter()改为first()(如果codeid是唯一标识,也可以用get(),但first()能避免因对象不存在抛出异常),同时增加对象存在性判断,确保安全访问star属性。
修改后的代码示例:
@property def star(self): # 用exists()直接判断查询是否有结果,比原写法更高效 return Evenements.objects.filter(eventtype=93, xrefindividuproprio=self).exists() @property def star_descendant(self): # 获取父亲对象,不存在则返回None father = Individus.objects.filter(codeid=self.xrefpere_id).first() if father and father.star: return father # 补充母亲的判断逻辑(原代码未完成,这里补上) mother = Individus.objects.filter(codeid=self.xrefmere_id).first() if mother and mother.star: return mother # 都不满足时返回None或其他默认值 return None
关键改动说明
- 替换
filter()为first():返回QuerySet中的第一个匹配对象,无匹配则返回None,避免直接操作集合导致的属性错误。 - 增加存在性判断:先确认
father/mother不为空,再访问star属性,防止None对象调用属性引发新异常。 - 简化
star属性逻辑:用exists()直接判断查询是否有结果,比原写法更高效简洁。
内容的提问来源于stack exchange,提问作者Night18
相关产品推荐
相关产品推荐

