首页 > 解决方案 > PonyORM - 以编程方式设置字段值

问题描述

我有一个User具有以下结构的类:

class User(UserMixin, db.Entity):
    id = PrimaryKey(int, auto=True)
    vorname = Required(str)
    nachname = Required(str)
    email = Required(str)
    password_hash = Required(str)
    role = Required(str)

    def set_password_hash(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

不幸的是,创建一个然后自动存储在数据库中的用户对象是不可能的,因为我只password从网络表单中获取原始字段值。

with db_session:
    new_user = User(
        vorname=form.vorname.data,
        nachname=form.nachname.data,
        email=form.email.data,
        role=form.role.data,
    )
    new_user.set_password_hash(form.password.data) # this line is not called, since the creation of new_user fails because of the missing password field.

是否可以推迟保存到数据库?或者使用我的自定义函数来设置password_hash值?

标签: pythonponyorm

解决方案


我刚刚遇到了类似的事情,也使用了Flask-Loginpony

你当然可以使用password_hash = Optional(str),但如果你不想要这个,你可以考虑覆盖模型__init__,给它一个简单的密码,然后在传递它之前生成哈希:

def __init__(self, *args, password, **kwargs):
    kwargs['password_hash'] = generate_password_hash(password)
    super().__init__(*args, **kwargs)

在您的示例中,您可以像这样简单地调用它:

new_user = User(
        vorname=form.vorname.data,
        nachname=form.nachname.data,
        email=form.email.data,
        role=form.role.data,
        password=form.password.data,
    )

推荐阅读