【问题标题】:Django best practice - compare usersDjango 最佳实践 - 比较用户
【发布时间】:2018-04-27 10:17:58
【问题描述】:

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

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

访问

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

比较用户个人资料是否属于当前用户的最佳方法是什么?

我可以写

if user == request.user

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

或者我可以写

if user.username == request.user.username

if user.id == request.user.id

【问题讨论】:

  • 为什么要比较用户和用户。您可以简单地使用 request.user 作为个人资料
  • @AnjaneyuluBatta.. 在某些情况下我们必须比较它们...比如提供编辑个人资料的选项,等等!
  • 这取决于您的user 实际上是什么。如果它是与request.user 相同类型的模型实例,那么对象之间的简单== 是比较正确的方法。 Django 将负责正确的内部比较操作。如果它来自其他类型,您必须自己进行正确的比较,例如比较 username 属性。

标签: python django


【解决方案1】:

if user == request.user: 是正确的方法。比较基于数据库主键,而不是字符串表示。 Django 文档:https://docs.djangoproject.com/en/2.0/topics/db/queries/#comparing-objects

【讨论】:

    【解决方案2】:

    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__ 方法。希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      我认为if user.pk == request.user.pk 将是最佳实践,因为每个用户都有不同的 PK(主键),因此您的 Web 应用程序不会有任何混乱。

      【讨论】:

      • 当然,这仅在您编写可重复使用的应用程序时才重要。在一个典型的 Django 项目中,您知道并且可以依赖于特定形状的用户模型。
      • Django 模型已经使用 pk 进行比较,所以正确的测试是 user == request.user
      猜你喜欢
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2017-06-20
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多