Django调用自定义get_related_filter方法报'super'无objects属性错误
报错核心成因
- 对
super()的代理逻辑、Django ORM的objects属性挂载规则存在认知偏差
你在get_related_filter实例方法中编写的super(Money, self).objects,此时super代理的访问目标是Money类的直接父类django.db.models.Model。该父类本身不存在objects属性——objects作为默认查询管理器,是Django通过模型元类机制,在初始化你自定义的具体模型类(即Money类)时,动态挂载到类自身上的类属性,既不存储在父类models.Model的命名空间中,也无法通过super的继承链代理访问到,因此直接触发'super' object has no attribute 'objects'的报错。
此处的认知混淆主要来自常见的super使用场景:在重写实例方法(如save()、delete())时,确实可以通过super()调用父类的同名实例方法,但objects是绑定在具体模型类上的管理器属性,和父类实例方法不属于同一套属性挂载逻辑,不能套用相同的访问方式。 - 现有代码还存在其他会阻塞运行的隐藏问题
__str__方法的强制要求是返回字符串类型,但代码中直接返回了self.money(DecimalField对应的Decimal类型值),后续触发模型实例的字符串渲染(如后台列表展示)时,会抛出返回类型不合法的错误。
可运行的修正方案
调整get_related_filter的查询实现逻辑,移除无意义的super访问,直接通过实例绑定的类获取查询管理器:
# 需提前导入Q对象,否则会触发Q未定义的报错 from django.db.models import Q class Money(models.Model): money = models.DecimalField(max_digits=19, blank=True, default=0, decimal_places=2) def get_related_filter(self, **kwargs): # 从实例绑定的模型类上获取查询管理器,和视图层反射动态导入模型的逻辑完全兼容 results = self.__class__.objects.filter( Q(money__icontains=kwargs['search_query']) ) return results def __str__(self): # 强制将Decimal值转成字符串,满足__str__的返回要求 return str(self.money)
这种实现不需要硬编码模型类名,后续如果给Money类配置自定义管理器,get_related_filter也能自动适配,不需要同步修改方法内部的查询逻辑。
内容的提问来源于stack exchange,提问作者JopaBoga
相关产品推荐
相关产品推荐

