Django最佳实践-比较用户

4
我正在做一个小项目,其中有一个用户个人资料页面。
这个页面有一个名为“user”的变量。 该变量包含当前个人资料页面的用户对象。 已登录用户对象可通过“request.user”访问。
如果只打印用户对象,它将返回用户名,因为模型在“__str__”函数中返回它。
最好的方法是如何比较用户资料是否属于当前用户?
我可以直接写
if user == request.user

如果Django更改了__str__函数的返回值呢?

或者我可以这样写:

if user.username == request.user.username

或者

if user.id == request.user.id

为什么要将用户与用户进行比较。您可以直接使用request.user来获取个人资料。 - anjaneyulubatta505
1
@AnjaneyuluBatta.. 有时我们需要比较它们... 比如提供编辑个人资料的选项等等! - letsintegreat
这取决于你的“user”实际上是什么。如果它是与“request.user”相同类型的模型实例,那么对象之间的简单“==”比较就是正确的比较方式。Django会处理正确的内部比较操作。如果它来自另一种类型,则必须自己进行正确的比较,例如比较“username”属性。 - Klaus D.
3个回答

11

4
罗曼·米洛什尼琴科已经回答了这个问题,此处只是一个小附加说明:
看起来这个问题的根源是您认为` == `比较会内部调用`__str __`函数。但事实并非如此。
`__str__`方法有时会隐式地被调用,但只在明确定义的地方才会这样做,例如:
  • 通过`print(obj)`函数
  • 由于字符串格式化而调用,例如:`'{0}'.format(obj)`,`f'{obj}'`或`'%s' % obj`
  • 还有一个`__repr__`方法,在其他地方也会被隐式调用,比如在Python交互式Shell中的每个值之后。
    >>> a = SomeObject()
    >>> a
    <__main__.SomeObject object at 0x7f5f218889e8>
    

    然而,==运算符并不涉及上述任何内容,而是调用__eq__方法。希望这有所帮助!

    0
    我认为if user.pk == request.user.pk是最佳实践,因为每个用户都有不同的主键(PKs),所以在您的Web应用程序中不会出现任何混乱的机会。

    当然,这只有在编写可重用的应用程序时才会有影响。在典型的Django项目中,您知道并且可以依赖于特定形状的User模型。 - Kos
    Django模型已经使用pk进行比较,因此正确的测试方式是user == request.user - bruno desthuilliers

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接