Как отфильтровать по названию модели ReferenceProperty? - PullRequest
0 голосов
/ 10 мая 2011

У меня есть следующие 3 класса:

class Locality(db.Model):
  location = db.ReferenceProperty()

class Organisation(db.Model):
  locality = db.ReferenceProperty(Locality)

class Position(db.Model):
  locality = db.ReferenceProperty(Locality)

Свойство Locality.location является ссылкой на объект Organization или Position.Мне нужно отфильтровать по местоположению и получить все записи со ссылкой на организацию.

Я уже пробовал, но это не сработает:

Locality.all().filter("location =",Organisation)

Любые советы будут оценены.

Ответы [ 4 ]

1 голос
/ 10 мая 2011

В этой строке:

Locality.all().filter("location =", Organisation)

Вы должны передавать экземпляр Organization, а не сам класс, например ::1004*

org = Organisation.get(some_org_key)
Locality.all().filter("location =", org)
0 голосов
/ 12 мая 2011

Наконец, я нашел решение на основе PolyModels:

class Locality(polymodel.PolyModel):
  { geo properties here }

class Organisation(Locality):
  title = db.StringProperty()

class Position(Locality):
  title = db.StringProperty()

Чтобы отфильтровать все организации по географическим свойствам:

Organisation.all().filter({by geo properties of Locality model})

Чтобы отфильтровать все населенные пункты (организации + должности)по гео-свойствам:

Locality.all().filter({by geo properties of Locality model})

Наверное, мое первоначальное объяснение было очень неясным.Простите за это.И спасибо всем за советы.Они были очень полезны.

0 голосов
/ 10 мая 2011

Мне нравится подход Абдула лучше, чем ответ Дрю (хотя он правильно отвечает на ваш конкретный вопрос).Я не знаю всех движущихся частей здесь, но я подозреваю, что вы хотите смоделировать это немного по-другому, возможно, используя PolyModel, и некоторую ненормализацию.Я имею в виду, просто глядя на отношения этих четырех классов, я вижу много разыменования, выполняемого только для простых запросов.

0 голосов
/ 10 мая 2011
class Locality(db.Model):
  location = db.ReferenceProperty()

class Organisation(db.Model):
  locality = db.ReferenceProperty(Locality,collection_name='org')

class Position(db.Model):
  locality = db.ReferenceProperty(Locality,collection_name='pos')

теперь у каждого объекта locality будет атрибут loc, который является ничем иным, как коллекцией Organization.

Чтобы узнать больше о моделировании, пройдите этот блог

...