Python中缺少动态查找器和方法
我正在尝试在Python(用于webapp /GAE)中实现类似Rails动态查找器的功能。动态查找器的工作方式如下:
- 您的人员有一些字段:姓名,年龄和电子邮件。
- 假设您要查找所有名称为“ Robot”的用户。
Person类具有一个称为“ find_by_name”的方法,该方法接收名称并返回查询结果:
@classmethod
def find_by_name(cls, name):
return Person.gql("WHERE name = :1", name).get()
不必为每个属性编写类似的方法,我想使用类似Ruby的method_missing的方法来执行此操作。
-
在这里实际上没有必要使用GQL-这只会使事情变得复杂。这是一个简单的实现:
class FindableModel(db.Model): def __getattr__(self, name): if not name.startswith("find_by_"): raise AttributeError(name) field = name[len("find_by_"):] return lambda value: self.all().filter(field, value)
注意,它返回一个查询对象,您可以调用.get()、. fetch()等。这是更通用的方法,但是如果您愿意的话,当然可以使其仅返回单个实体。