【问题标题】:How can I overload the assignment of a class member?如何重载班级成员的分配?
【发布时间】:2009-08-25 08:58:32
【问题描述】:

我正在使用 Django 在 Python 中编写一个 Player 模型类,但我遇到了密码成员的一个小问题。我希望密码在赋值时自动散列,但我找不到任何关于重载赋值运算符或任何东西的信息。有什么办法可以重载password的赋值,从而自动在上面做hashlib.md5(password).hexdigest()

from django.db import models

class Player(models.Model):
    name = models.CharField(max_length=30,unique=True)
    password = models.CharField(max_length=32)
    email = models.EmailField()

【问题讨论】:

  • 你为什么不明确地这样做?
  • 因为很痛苦,Django 自动管理员不会这么做。
  • 疼痛?在您的代码中添加另一行?您已经拥有的行。
  • @SilentGhost 你为什么不直接说线?
  • “Django 自动管理员不会这样做”,这是转移话题。

标签: python django class variable-assignment


【解决方案1】:

你不能使用属性并覆盖字段的设置器吗?

引用django documentation:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    def _get_full_name(self):
        return "%s %s" % (self.first_name, self.last_name)

    def _set_full_name(self, combined_name):
        self.first_name, self.last_name = combined_name.split(' ', 1)

    full_name = property(_get_full_name)

    full_name_2 = property(_get_full_name, _set_full_name)

【讨论】:

  • "Properties" 是 Python 术语中那些对 Python 新手来说具有挑战性的奇怪术语之一。正如 Krzyk 的示例所示,您可以创建“getter”和“setter”函数(以及“delete-er”函数),并且当您将类属性绑定到调用“property()”的结果时(将 getter 作为必需的参数和可选的设置器和删除器)...那么所有对该属性的访问现在都由属性函数介导。
【解决方案2】:

您可以使用我为 SQLAlchemy 创建的 HashedProperty 类。您可以像这样与 Django 一起使用:

class Player(models.Model):
    name = models.CharField(max_length=30,unique=True)
    password_hash = models.CharField(max_length=32)
    password_salt = models.CharField(max_length=32)
    password = HashedProperty('password_hash', 'password_salt',
                   hashfunc=salted_hexdigest(hashlib.md5),
                   saltfunc=random_string(32))
    email = models.EmailField()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多