2

好奇我试图在 Peewee 的ForeignKeyField. 我已将其子类化以使用该Hashid库为hashid处理模型对象的任何事物(例如,使用 API 进行序列化)提供一个 obscured 而不是原始 Integer。

存储和检索对象(行)似乎很好,但是当使用ModelClass.create创建一个新的对象/行时,我发现id对象上的是int值,而不是hashid编码的输出。

问题是:如何让新模型实例在创建后在 id 字段中报告 hashid 编码的 id,而不是原始 int?它是 peewee 中应该使用该python_value功能的错误,还是这是预期的行为?不建议子类化PrimaryKeyField吗?

下面是一些代码来演示:

from peewee import PrimaryKeyField
from hashids import Hashids

class HashidPrimaryKeyField(PrimaryKeyField):
    hashid = Hashids(min_length=16)

    @property
    def prefix(self):
        return self.model_class.__name__.lower() + '_'

    def db_value(self, value):
        try:
            return self.hashid.decode(value.replace(self.prefix, ''))
        except Exception as e:
            print(e)
            return super().db_value(value)

    def python_value(self, value):
        hashed = self.hashid.encode(value)
        return self.prefix + hashed


class User(BaseModel):
    id = HashidPrimaryKeyField()
    first_name = TextField(null=False)
    last_name = TextField(null=False)
    email = TextField(null=False, index=True)
    password = TextField(null=False)

    class Meta:
        database = SOME_DATABASE


u = User.create(first_name="Foo", last_name="Bar", email="foo@bar.com", password="some salt/hashed password")
print(u.id) # Prints: '1'

u2 = User.get(User.id == u.id)
print(u.id) # Prints the nicely-formatted hashid: "user_4q2VolejRejNmGQB"

assert(u == u2) # Fails.
4

0 回答 0