Подкласс ForeignKeyField python_value не наблюдается после Model.create
Любопытно о поведении, которое я пытаюсь добавить поверх Peewee's ForeignKeyField
, Я подкласс это использовать Hashid
библиотека, чтобы обеспечить скрытый hashid
вместо необработанного Integer для всего, что связано с объектами модели (скажем, для сериализации с API).
Хранение и извлечение объектов (строк), кажется, идет хорошо, но при использовании ModelClass.create
чтобы сделать новый объект / строку, я считаю, что id
на объекте является int
значение, а не вывод 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.