2011-06-20 135 views
2

用例是我有一个远程(读取缓慢)数据库,我通过它从ORM映射类获取一些数据。作为字典键的sqlalchemy对象?

我想将非db临时数据存储在ORM数据的旁边,我不想用一堆临时属性来污染映射类命名空间(其他人使用的),所以我可以存储一些对象特定的数据。我真正想做的是将这些用作字典中的关键字。

我见过this thread所以我知道这是可以做到的,但我不喜欢的例子:

def __hash__(self): 
    return id(self) if self.id is None else hash(self.id) 

因为我的使用情况包括DB组AUTO_INCREMENT主键哪些不会直到刷新后才存在。可能发生的哈希变化是哈希中的一种,我想避免它。

我可以尝试修复它,如果我在__hash__中放入一个冲水器,但感觉这样做太大副作用是一个好主意。

所以,问题是:是否有一种很好的方法来使用ORM映射类实例作为字典的关键字,还是有另一种更好的方式将临时数据与对象关联而不会污染它的名称空间?

回答

3

考虑将本地“非db”数据作为非映射属性存储在适当的映射实例中。例如

local_data = {'batsman': 'Sangakkara', 'bowler': 'swann'} 
mapped_instance_from_query._local_data = local_data 

SQLAlchemy将简单地忽略未映射的属性。

+0

总体意义。我想我不得不在类定义中添加这些,但这是做到这一点的正确方法。 – underrun