使用Django MPTT获取子节点全家族报错:TreeQuerySet无get_family属性
Django MPTT调用get_family()报错的解决方案
嘿,这个问题我之前也碰到过,其实原因很清晰:你用filter()拿到的是一个TreeQuerySet集合,而get_family()是Django MPTT给单个模型实例提供的方法,根本不能直接在集合上调用,所以才会抛出这个AttributeError。
给你两种针对性的解决办法:
1. 确定匹配单个对象时用get()替代filter()
如果你能保证name__startswith='signals'只会命中一个Platform对象,直接把filter()换成get()就行,这样拿到的就是单个实例,就能正常调用get_family()了:
p = Platform.objects.get(name__startswith='signals') s = p.get_family() print(s)
⚠️ 小提醒:如果get()没找到匹配对象,会抛出DoesNotExist异常;如果找到多个,会抛出MultipleObjectsReturned异常,记得根据你的业务场景做异常处理哦。
2. 多个匹配对象时遍历处理
如果filter()可能返回多个Platform对象,那你得遍历集合里的每个实例,分别调用get_family():
platforms = Platform.objects.filter(name__startswith='signals') for p in platforms: family = p.get_family() print(family)
顺带补充个小知识点:Django MPTT里的方法分两类,一类是实例方法(比如get_family()、get_ancestors()),只能给单个模型对象用;另一类是QuerySet方法(比如tree.filter()、链式调用的get_descendants()),才是作用于集合的,以后用的时候注意区分就行~
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

