2012-04-09 4 views
1

Я пытаюсь получить всех родителей/детей от одного до многих отношений. Традиционно, я мог бы сделать это с помощью соединения, но делать это в хранилище данных ускользает от меня.GAE DataStore referenceProperty

Я нашел несколько частичных примеров для этого, но не тот, который еще не завершен.

у меня есть:

class Owner(db.Model): 
    name = db.StringProperty() 

class Pet(db.Model): 
    petname = db.StringProperty() 
    owner = db.ReferenceProperty(Owner, collection_name='pets') 

#now I want to print all pets owned by scott 
scott = Owner(name="scott") 
scott.put() 
Pet(owner=scott,petname="rufus").put() 

pets = Pet.all().filter('owner =', "scott").fetch(100) 
print Pet.all().filter('owner =', "scott").fetch(0) 

ответ

4

Ваш запрос должен работать нормально, если вы удалите кавычки «Скотт», я думаю.

Вы также могли бы сделать все сущности Скотта Pet есть его сущность, как их родители:

class Owner(db.Model): 
    name = db.StringProperty() 

class Pet(db.Model): 
    petname = db.StringProperty() 

scott = Owner(name="scott") 
scott.put() 

Pet(parent=scott, petname="rufus").put() 
Pet(parent=scott, petname="fluffy").put() 
Pet(parent=scott, petname="snoogums").put() 

pets = Pet.all().ancestor(scott).fetch(100) 
# Feed pets to your templating engine. So to speak. 

Делая Скотт вышестоящих субъектов домашних животных, все они будут добавлены к одной группе, и ancestor запрос дает вам простой и строгий способ получить все объекты Pet, являющиеся дочерними элементами данного «Владельца». Вы должны получить гораздо лучшую производительность с запросом предка, чем запрос, не относящийся к предку.

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

Чтобы иметь печатаемое представление вашего Pet лица, придать ему метод __unicode__, что-то вроде этого:

class Pet(db.Model): 
    petname = db.StringProperty() 

    def __unicode__(self): 
     return "I am " + self.petname 

__unicode__ должен возвращать строку с информацией, которую вы хотите видеть отпечатаны print заявления. Как замечает Ник в комментариях, вы не должны использовать print в приложении AppEngine. SDK поставляется с шаблонами Django и Jinja2. Используйте один из них или импортируйте тот, который вы предпочитаете.

+0

Я думаю, что может быть то, что я ищу, но как распечатать их? Если я просто: печатать домашние я получаю: [<__ main__.Pet объект в 0x10859df50>, <__ объекта main__.Pet в 0x1085904d0>, <__ main__.Pet object at 0x107bccb50>] –

+0

Ответил на ваш вопрос @stubblejumper –

+0

Обратите внимание, что '__repr__' предназначен для возврата представления« кода »объекта; '__unicode__' - это метод, используемый для читаемого человеком представления, но вы, вероятно, должны использовать систему шаблонов и выводить только те биты, которые вам интересны в текущей ситуации. И вы действительно, действительно, действительно не должны использовать «печать» в приложении App Engine. –

0

Посмотрите на The GQL examples made by google.

Используйте имя владельца как уникальный ключ, дающий «scott» ключевому имени вместо «name», когда instanciating Owner.

scott = Owner(key_name="scott") 

Создайте домашнее животное Скотту как родитель

pet = Pet(key_name='rufus', parent=scott) 

и запросить его питомцев

SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott') 
0

Вы должны фильтровать Ключ Владелец:

#not str "scott", use scott object. 
pets = Pet.all().filter('owner =', scott).fetch(100) 
Смежные вопросы