我正在开展一个小项目,我有一个用户个人资料页面。
此页面有一个名为用户的变量。 此变量包含当前配置文件页面的用户对象。 可以使用 request.user
访问登录的用户对象如果您只是打印用户对象,它将返回用户名,因为模型在__str__
函数中返回
如果用户个人资料属于当前用户,比较的最佳方式是什么?
我可以写
if user == request.user
但是如果django改变了__str__
函数的返回值呢?
或者我可以写
if user.username == request.user.username
或
if user.id == request.user.id
答案 0 :(得分:9)
if user == request.user:
是正确的方法。比较基于数据库主键,而不是字符串表示。 Django文档:https://docs.djangoproject.com/en/2.0/topics/db/queries/#comparing-objects
答案 1 :(得分:4)
Roman Miroshnychenko已经回答了这个问题,只是一个小小的附录:
看起来这个问题的起源是因为您假设==
比较会在内部调用__str__
函数。事实并非如此。
有时会隐式调用__str__
方法,但只能在明确定义的位置调用,例如:
print(obj)
'{0}'.format(obj)
或f'{obj}'
或'%s' % obj
还有其他地方隐式调用的__repr__
方法,例如在Python交互式shell中的每个值之后:
>>> a = SomeObject()
>>> a
<__main__.SomeObject object at 0x7f5f218889e8>
但是,==
运算符并未触及任何内容,而是调用__eq__
方法。希望有所帮助!
答案 2 :(得分:0)
我认为if user.pk == request.user.pk
将是最佳做法,因为每个用户都有不同的PK(主键),因此您的网络应用中不会有任何混乱。