2014-01-03 2 views
0

Итак, у меня есть две модели: авторы и сообщения. Оба имеют логическое поле «статус». Сообщения выполняются авторами, поэтому поле db.ReferenceProperty(). Модели таковы:Google App Engine Python - Datastore: Условия с db.ReferenceProperty()

class Authors(db.Model): 
    status = db.BooleanProperty(default = True) 
    name = db.StringProperty(required = True) 

class Posts(db.Model): 
    status = db.BooleanProperty(default = True) 
    title = db.StringProperty(required = True) 
    content = db.TextProperty(required = True) 
    author = db.ReferenceProperty(Authors) 

Итак, я хочу, чтобы иметь возможность перечислить сообщения на моем сайте, когда оба поля статуса (Сообщения и авторы ссылаются) устанавливаются в True. Если я установил Authors.status в False, автоматически все его дочерние сообщения больше не будут отображаться.

Я знаю, что это не работает, но это было бы что-то вдоль этих линий:

q = Posts.all() 
q.filter('status =', True) 
q.filter('author.status =', True) 
q.run() 

Я знаю, что это JOIN и GAE хранилищу не поддерживает соединения, но какие-либо идеи о том, как я мог возможно, это? Заранее спасибо.

ответ

1

Как вы говорите, вы не можете подключаться к хранилищу данных. Таким образом, вы ограничены итерацией и проверкой статуса.

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

all_posts = [] 
q = Authors.all().filter('status', True) 
for author in q: 
    posts = Post.all().filter('author', author).filter('status', True) 
    all_posts.extend(posts.run()) 

Другим способом получить ключи для всех авторов со статусом = True, поместите их в наборе, то перебрать все посты и проверить, если ключ автора есть:

all_posts = [] 
authors = set(Authors.all(keys_only=True).filter('status', True).run()) 
q = Post.all().filter('status', True) 
for post in q: 
    if post._author in authors: 
     all_posts.append(post) 

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

Смежные вопросы