Фильтрация моделей с помощью ReferenceProperties - PullRequest
5 голосов
/ 15 января 2009

Я использую Google App Engine, и у меня возникают проблемы при написании запросов для фильтрации ReferenceProperties.

например.

class Group(db.Model):
    name = db.StringProperty(required=True)
    creator = db.ReferenceProperty(User)

class GroupMember(db.Model):
    group = db.ReferenceProperty(Group)
    user = db.ReferenceProperty(User)

И я попытался написать что-то вроде этого:

members = models.GroupMember.all().filter('group.name =', group_name)

и другие разные вещи, которые не работают. Надеюсь, кто-нибудь подскажет мне в правильном направлении ...

Ответы [ 5 ]

5 голосов
/ 08 февраля 2009

Если ваши группы имеют уникальные имена, то ваше «group.name» является уникальным идентификатором группы.

Это означает, что вы можете написать:

  members = models.GroupMember.all().filter(
    "group =",model.Group.gql("WHERE name=:1", group_name).get()
    )

хотя вам нужно делать это только в том случае, если у вас еще нет группового объекта, лежащего где-то в стеке.

Эссе Google о многих для многих с appengine: здесь .

4 голосов
/ 12 февраля 2009

Если вы хотите получить членов группы, у ReferenceProperties есть такая встроенная функция.

class GroupMember(db.Model):
    group = db.ReferenceProperty(Group, collection_name="groupMembers")
    user = db.ReferenceProperty(User, collection_name="groupMembers")

Тогда вы можете написать:

# get the group entity somehow
group = Group.get(group_key)     
# do something with the members, such as list the nicknames
nicknames = [x.user.nickname for x in group.groupMembers]
1 голос
/ 23 января 2009

Это приведет к двум ударам хранилища данных, но должно работать. Если вы используете memcache не должно быть проблемой.

group = models.Group.all().filter("name =", group_name).get()
members = models.GroupMember.all().filter('group =', group)   
1 голос
/ 16 января 2009

Для этого потребуется объединение, что невозможно в App Engine. Если вы хотите фильтровать по свойству другой модели, вам нужно включить это свойство в модель, к которой вы обращаетесь.

0 голосов
/ 25 января 2010

Используя модели, которые вы определили в своем вопросе, допустим, вы хотите перечислить всех членов группы под названием " Space Monkeys ".

mygroup = Group.gql("WHERE name = :1",'Space monkeys')

for group_member in mygroup.groupmember_set:
    print 'group members name is: %s' % (group_member.user.name)

"groupmember_set" называется " неявным свойством коллекции " и очень полезно. Вы можете называть его как угодно, переопределив имя по умолчанию, используя параметр ключевого слова collection_name для ReferenceProperty. Пример см. В ответе Thomas L Holaday .

Все это объясняется в очень хорошей статье Рэйфа Капла: Моделирование отношений сущностей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...