在Model.create之后没有观察到ForeignKeyField子类python_value

时间:2017-10-23 18:09:41

标签: python-3.x peewee hashids

对我试图在Peewee Hashid之上添加的行为感到好奇。我已经将它子类化为使用hashid库来提供模糊的ModelClass.create而不是原始的Integer,以处理模型对象(例如,使用API​​进行序列化)。

存储和检索对象(行)似乎没问题,但是当使用id创建新对象/行时,我发现对象上的inthashid值,而不是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

0 个答案:

没有答案