好奇我试图在 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.