I have the following model structure
class User(db.Model) :
nickname = db.StringProperty(required=True)
fullname = db.StringProperty(required=True)
class Article(db.Model) :
title = db.StringProperty(required=True)
body = db.StringProperty(required=True)
author = db.ReferenceProperty(User, required=True)
class Favorite(db.Model) :
who = db.ReferenceProperty(User, required=True)
what = db.ReferenceProperty(Article, required=True)
I’d like to display 10 last articles according to this pattern:
article.title, article.body, article.author(nickname), info if this article has been already favorited by the signed in user.
I have added a function which I use to get the authors of these articles using only one query (it is described here)
But I don’t know what to do with the favorites (I’d like to know which of the displayed articles have been favorited by me using less than 10 queries (I want to display 10 articles)). Is it possible?
You can actually do this with an amortized cost of 0 queries if you denormalize your data more! Add a
favoritesproperty toAuthorswhich stores a list of keys of articles which the user has favorited. Then you can determine if the article is the user’s favorite by simply checking this list.If you retrieve this list of favorites when the user first logs in and just store it in your user’s session data (and update it when the user adds/removes a favorite), then you won’t have to query the datastore to check to see if an item is a favorite.
Suggested update to the
Authorsmodel:When the user logs in, just cache their list of favorites in your session data:
Then when you show the latest articles, you can check if they are a favorite just by seeing if each article’s key is in the favorites list you cached already (or you could dynamically query the favorites list but there is really no need to).