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

Django使用contains过滤用户数据时报User无award属性如何解决

问题解决方法

错误原因

  1. Award模型中指向User的外键字段是admin,Django针对这种一对多关联会给User模型自动生成默认的反向查询管理器,命名为award_set,不存在request.user.award这个属性,这是报错的直接诱因。
  2. 单个用户可以关联多个Award对象,你之前的写法默认只取单个slug做过滤,不符合业务逻辑需求。

解决方案

方案1:精确匹配(优先使用,性能更高)

如果SuccessfulTransactionHistory.award字段存储的是完整的Award.slug值,只需要精确匹配即可,代码如下:

# 先获取当前用户所有关联Award的slug列表
user_award_slugs = Award.objects.filter(admin=request.user).values_list('slug', flat=True)
# 过滤符合条件的交易记录
success_list = SuccessfulTransactionHistory.objects.filter(award__in=user_award_slugs).order_by('-date')

方案2:模糊匹配

如果你确实需要contains模糊匹配规则(比如award字段存储的内容包含slug但不是完全等于),使用Q对象构造多条件或查询:

from django.db.models import Q

# 先获取当前用户所有关联Award的slug列表
user_award_slugs = Award.objects.filter(admin=request.user).values_list('slug', flat=True)

# 构造查询条件:只要award字段包含任意一个用户关联的slug就算匹配
query = Q()
for slug in user_award_slugs:
    if slug: # 过滤掉为空的slug
        query |= Q(award__contains=slug)

success_list = SuccessfulTransactionHistory.objects.filter(query).order_by('-date')

可选优化

如果你后续需要频繁通过User查询关联的Award,可以给外键字段添加related_name简化反向查询写法:

# 修改Award模型的admin字段
admin = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='awards')

修改后就可以用request.user.awards.all()直接获取当前用户所有关联的Award对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:06