无法通过使用带有用户名和密码的过滤器来获取用户

Cannot obtain user by using filter with username and password

我正在使用以下代码

email = validated_data["login"]
password = validated_data["password"]
user_obj = User.objects.filter(Q(email__exact=email) & Q(password__exact=password))

我从 admin 更改了密码,但没有返回任何用户。但是,如果我删除密码检查,那么我会得到一个用户对象 back.The 对象,如果我删除 Q(password__exact=password) 条件,我会返回该对象,其 _password 字段为 None。这段代码已经运行良好了一段时间,但今天它没有返回对象。我在这里错过了什么吗?我确认我从 client.I 收到了正确的用户名和密码,还尝试使用该用户名和密码访问管理员(该帐户具有员工身份)并且我能够登录。所以密码是正确的但是对于由于某种原因我无法通过过滤获得该用户。 ?我可能做错了什么?

这是因为 Django 不会将密码存储为散列的简单文本,您不能对其执行 password__exact 它每次都会 return none 除非您是在此处

获得相同的哈希值 password = validated_data["password"]

password 不是以纯文本形式存储的,而是作为散列(以及更多)存储的。通过用户名获取用户并查看密码:

# assumes there can be only one
user = User.objects.get(email=email) 
# this checks the plaintext password against the stored hash 
correct = user.check_password(password)  

顺便说一句,逻辑 AND 不需要 Q 个对象。 filter(email__exact=email, password__exact=password) 就足够了,尽管在这种情况下它没有多大意义。