Извлечение иерархических данных из хранилища данных - PullRequest
0 голосов
/ 28 октября 2010

Я создаю приложение с помощью Google App Engine (и Python).У меня два вопроса о получении данных из хранилища данных.

У меня есть информация о пользователях и информация о сообщениях, сделанных пользователями.Вот часть моделей БД:

class User(db.Model):
    country = db.StringProperty() 
    # many other entities

class Post(db.Model):
    author = db.ReferenceProperty(User) 
    # many other entities

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

posts_query = Post.all().filter(' author.country == ', country)
posts = posts_query.fetch(limit = 100)

Но этот запрос не возвращает никаких результатов (переменная страны имеет значение, которое существует в хранилище данных).Что мне нужно исправить в моем запросе, чтобы он работал?

И второй вопрос: как (в данной ситуации) я могу получить все сообщения из хранилища данных, если количество сообщений неизвестно (и может быть>100)?

Заранее спасибо,

-скажи

Ответы [ 2 ]

3 голосов
/ 28 октября 2010

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

Что касается извлечения результатов «все», вы можете указать сколь угодно большойограничить, но подумайте: вы действительно хотите это сделать?Существует ограничение на количество результатов, которые вы можете разумно представить пользователю за один раз;если у вас есть больше результатов, чем это, вы почти наверняка захотите разбить на страницы.

0 голосов
/ 29 октября 2010

Вторая денормализация. Если страна является конкретной вещью, к которой вам нужно часто обращаться, вы можете добавить новую модель именно для нее. Страна становится Ссылочным Свойством как для пользователя, так и для Почты:

class User(db.Model):
  country = db.ReferenceProperty(Country,collection_name=users) 
  # many other entities

class Post(db.Model):
  author = db.ReferenceProperty(User) 
  country = db.ReferenceProperty(Country,collection_name=posts) 
  # many other entities

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

# posts from everyone in the user's country:
# user.country.posts.all()

В ответ на ваш второй вопрос вы можете использовать ваш posts_query в качестве итерации для получения всех результатов. См. Документацию по App Engine: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_fetch

...