You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 15:57:04