Динамические средства поиска и метод, отсутствующий в Python

Я использую этот простой метод:

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;
}
5
задан Federico Builes 26 May 2009 в 22:10
поделиться

4 ответа

На самом деле здесь нет необходимости использовать 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 () и т. Д .; это более универсально, но если вы хотите, вы, конечно, можете заставить его просто возвращать одну сущность.

7
ответ дан 14 December 2019 в 04:46
поделиться

Вы можете использовать метод 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 ...

1
ответ дан 14 December 2019 в 04:46
поделиться
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()
0
ответ дан 14 December 2019 в 04:46
поделиться
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.

Я не уверен, что это правильный путь делать вещи. Но если у вас есть возможность реализовать единый "поиск" для всех атрибутов, то приведенный выше сценарий работает.

0
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: