Как запросить хранилище данных при использовании ReferenceProperty? - PullRequest
2 голосов
/ 28 ноября 2010

Я пытаюсь понять отношения 1-ко-многим в хранилище данных; но я не понимаю, как запрашивать и обновлять записи пользователя, когда модель включает ReferenceProperty. Скажите, у меня есть эта модель:

class User(db.Model):
    userEmail = db.StringProperty()
    userScore = db.IntegerProperty(default=0)

class Comment(db.Model):
    user = db.ReferenceProperty(User, collection_name="comments")
    comment = db.StringProperty()

class Venue(db.Model):
    user = db.ReferenceProperty(User, collection_name="venues")
    venue = db.StringProperty()

Если я правильно понимаю, один и тот же пользователь, уникально идентифицируемый userEmail, может иметь много комментариев и может быть связан со многими объектами (ресторанами и т.

Теперь предположим, что пользователь az@example.com уже находится в базе данных и отправляет новую запись.

На основании этого ответа Я делаю что-то вроде:

q = User.all()
q.filter("userEmail =", az@example.com)
results = q.fetch(1)
newEntry = results[0]

Но мне не ясно, что это делает! Я хочу обновить поля comment и venue, которые находятся под class Comment и class Venue.

Можете ли вы помочь мне понять, как это работает? Спасибо.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2010

Фрагмент, который вы опубликовали, делает это (см. Комментарии):

q = User.all() # prepare User table for querying
q.filter("userEmail =", "az@example.com")  # apply filter, email lookup 
                                              - this is a simple where clause
results = q.fetch(1) # execute the query, apply limit 1
the_user = results[0] # the results is a list of objects, grab the first one

После этого кода the_user будет объект, который соответствует записи пользователя с электронной почтой "az@example.com".После того, как вы установили свои справочные свойства, вы можете получить доступ к его комментариям и местам с помощью the_user.comments и the_user.venues.Некоторые места их проведения можно изменить, например, так:

some_venue = the_user.venues[0] # the first from the list
some_venue.venue = 'At DC. square'
db.put(some_venue) # the entry will be updated

Я предлагаю вам сделать общий обзор документации gae, в которой есть очень хорошие примеры, вы найдете ее очень полезной: http://code.google.com/appengine/docs/python/overview.html

** ОБНОВЛЕНИЕ **: Чтобы добавить новое место для пользователя, просто создайте новое место и назначьте запрашиваемый объект пользователя в качестве атрибута пользователя места:

new_venue = Venue(venue='Jeferson memorial', user=the_user) # careful with the quoting
db.put(new_venue)
1 голос
/ 28 ноября 2010

Чтобы получить все комментарии для данного пользователя, отфильтруйте свойство пользователя с помощью ключа пользователя:

comments = Comment.all().filter("user =", user.key()).fetch(50)

Чтобы вы могли сначала найти пользователя по электронной почте, а затем искать комментарии или места, используяего ключ.

...