Django最佳实践 - 比较用户

时间:2018-04-27 10:17:58

标签: python django

我正在开展一个小项目,我有一个用户个人资料页面。

此页面有一个名为用户的变量。 此变量包含当前配置文件页面的用户对象。 可以使用 request.user

访问登录的用户对象

如果您只是打印用户对象,它将返回用户名,因为模型在__str__函数中返回

如果用户个人资料属于当前用户,比较的最佳方式是什么?

我可以写

if user == request.user

但是如果django改变了__str__函数的返回值呢?

或者我可以写

if user.username == request.user.username

if user.id == request.user.id

3 个答案:

答案 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(主键),因此您的网络应用中不会有任何混乱。