Подкласс 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.

0 ответов

Другие вопросы по тегам