为什么Django中filter查询报错'QuerySet'对象无user_id属性?
Django get()与filter()方法核心区别
- 返回值差异:
get()会直接返回符合查询条件的单个模型实例,仅当匹配记录恰好为1条时正常运行;filter()返回的是QuerySet集合对象,是所有符合条件的模型实例的容器,无论匹配结果是0条、1条还是多条,都保持集合类型。 - 异常逻辑差异:
get()无匹配记录时抛出DoesNotExist异常,匹配到多条记录时抛出MultipleObjectsReturned异常;filter()无匹配时返回空QuerySet,匹配多条时返回包含所有对应实例的QuerySet,不会主动触发异常。
filter()无法直接访问user_id的原因
你调用filter()后拿到的是集合对象,不是单个用户实例,自然不能直接访问只有单个实例才有的user_id属性。如果要通过filter()实现同样的效果,需要从QuerySet中取出单个实例,示例写法如下:
# 取QuerySet第一条记录,确认仅1条匹配时可使用 user = UserProfile.objects.filter(forget_password_token=forget_password_token).first() if user: print(user.user_id)
get()查询无匹配时抛出异常的原因
这是get()的内置逻辑,当没有任何记录匹配传入的查询条件时,就会主动抛出UserProfile matching query does not exist异常。你可以通过try-except块捕获异常来处理校验码错误的场景:
try: user = UserProfile.objects.get(forget_password_token=forget_password_token) print(user.user_id) except UserProfile.DoesNotExist: # 自定义校验码错误的处理逻辑 print("无效的校验码")
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

