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

Django 未认证API出现AnonymousUser对象无属性报错如何解决?

问题根因

你移除API认证逻辑后,未携带认证信息的请求到达后端时,Django会将request.user赋值为内置的AnonymousUser实例,该实例不存在你在自定义用户模型中封装的is_liking_deal方法,因此触发属性错误。

解决方案

根据你的需求,这里提供两种可选实现:

方案1:匿名用户访问时already_liked固定返回False

直接修改序列化器的get_already_liked方法,增加用户认证状态判断即可:

def get_already_liked(self, obj):
    usr = self.context["request"].user
    if usr.is_authenticated:
        return usr.is_liking_deal(deal_obj=obj)
    # 匿名用户统一返回未点赞状态
    return False

方案2:匿名用户访问时不返回already_liked字段(更贴合需求)

如果希望未登录用户完全看不到点赞相关字段,只返回优惠基础信息,可以额外重写序列化器的to_representation方法动态移除字段:

def get_already_liked(self, obj):
    usr = self.context["request"].user
    return usr.is_liking_deal(deal_obj=obj)

def to_representation(self, instance):
    data = super().to_representation(instance)
    usr = self.context["request"].user
    # 匿名用户移除点赞状态字段
    if not usr.is_authenticated:
        data.pop("already_liked", None)
    return data

内容的提问来源于stack exchange,提问作者Zeed Tanue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:06:03