Я использую этот простой метод:
public Dictionary<string, string> objToDict(XYZ.ObjectCollection objs) {
var dict = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> each in objs){
dict.Add(each.Key, each.Value);
}
return dict;
}
На самом деле здесь нет необходимости использовать 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)
Обратите внимание, что он возвращает объект Query, который вы можете вызывать .get (), .fetch () и т. Д .; это более универсально, но если вы хотите, вы, конечно, можете заставить его просто возвращать одну сущность.
Вы можете использовать метод find_by и ключевые слова, как это делает Django:
class Person (object):
def find_by(self, *kw):
qspec = ' AND '.join('%s=%s' % kv for kv in kw.items())
return self.gql('WHERE ' + qspec)
person.find_by(name='Robot')
person.find_by(name='Robot', age='2')
В дальнейшем вы можете разработать свой собственный синтаксис запроса. Посмотрите, что делает Django ...
class Person(object):
def __getattr__(self, name):
if not name.startswith("find_by"): raise AttributeError(name)
field_name = name.split("find_by_",1)[1]
return lambda name: Person.gql("WHERE %s = :1" % field_name, name).get()
class Person:
name = ""
age = 0
salary = 0
def __init__(self, name, age):
self.name = name
self.age = age
def find (clsobj, * args): return Person (name = "Jack", age = 20)
Цикл for ниже вставляет @classmethod для всех атрибутов класса. Это делает доступными связанные методы "find_by_name", "find_by_age" и "sinf_by_salary".
for attr in Person.__dict__.keys():
setattr(Person, 'find_by_'+attr, find)
setattr(Person, 'find_by_'+attr, classmethod(find))
print Person.find_by_name ("jack"). Age # выведет значение 20.
Я не уверен, что это правильный путь делать вещи. Но если у вас есть возможность реализовать единый "поиск" для всех атрибутов, то приведенный выше сценарий работает.