Как я могу перегрузить назначение члена класса? - PullRequest
1 голос
/ 25 августа 2009

Я пишу класс модели Player на Python для Django, и у меня возникла небольшая проблема с паролем. Я хотел бы, чтобы пароль автоматически хэшировался при назначении, но я не могу найти ничего о перегрузке оператора назначения или что-то еще. Можно ли каким-либо образом перегрузить присвоение 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()

Ответы [ 2 ]

6 голосов
/ 25 августа 2009

Не можете ли вы использовать свойства и переопределить сеттер для поля?

Ссылаясь на документацию на django :

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)
0 голосов
/ 25 августа 2009

Вы можете использовать класс HashedProperty , который я создал для SQLAlchemy.Вы можете использовать с 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()
...