对我试图在Peewee Hashid
之上添加的行为感到好奇。我已经将它子类化为使用hashid
库来提供模糊的ModelClass.create
而不是原始的Integer,以处理模型对象(例如,使用API进行序列化)。
存储和检索对象(行)似乎没问题,但是当使用id
创建新对象/行时,我发现对象上的int
是hashid
值,而不是python_value
编码的输出。
问题是:如何让新模型实例在创建后在id字段中报告hashid编码的id,而不是raw int?这是peewee中的一个错误它应该使用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.
?
以下是一些要演示的代码:
listOne.add(peanut); // The listOne is a Set<String>
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(aux.getIndex());
updateRequest.type(org.core.database.json.Element.classType);
updateRequest.id(elementId.toString());
updateRequest.doc("listOne",listOne); // The new doc
element.setListOne(listOne); // Sets the new list for future updates
// Retry 3 times before failing the update
updateRequest.retryOnConflict(3);
client.update(updateRequest).get(); // Updates it