I'm new to Google Apps and I've been messing around with the hello world app that is listed on the google app site. Once I finished the app, I decided to try to expand on it. The first thing I added was a feature to allow the filtering of the guestbook posts by the user that submitted them.
All I have changed/added is simply a handler to the WSGIApplication and a new class for this handler. The model is the same, I'll post for reference:
class Greeting(db.Model):
author = db.UserProperty()
content = db.StringProperty(multiline = True)
date = db.DateTimeProperty(auto_now_add=True)
Using the Django template I changed the line that displays the authors nickname from:
<b>{{ greeting.author.nickname }}</b> wrote:
to:
开发者_如何学Python<a href="/authorposts/{{ greeting.author.user_id }}">
{{ greeting.author.nickname }}
</a></b> wrote:
The issue I'm having is that inside my python code I cannot access "greeting.author.nickname", or any of the other properties, such as "user_id". However they are accessible from the Django template, as the code I listed above for the template works and correctly creates a link to the author as well as displaying the nickname.
I am using URL Mapping based on the authors (a UserProperty) property "user_id". I am trying to find a way that I can filter the datastore using the user_id as the criteria. I've tried directly applying a filter to the query, I've tried pulling all the records and then iterating through them and use an If...Else clause.
I know the value is store into the datastore, because the Django template shows it, what do I have to do to use it as filter criteria?
When querying the Greeting
model, you cannot filter on fields within Greeting.author
(e.g., greeting.author.nickname
). In SQL, this would be done by doing a join on the Greeting
and User
tables. However, in GAE you can only query properties directly included on the model you are querying.
Since author
is a db.UserProperty
, you can filter by user like this:
# fetch up to 10 greetings by the current user
user = users.get_current_user()
results = Greeting.all().filter('author =', user).fetch(10)
To filter on other fields within author
, you would need to denormalize your Greeting
model - i.e., add copies of fields in author
which you want to be able to filter Greeting
on. For example, if you wanted to filter by author.nickname
, you would add an author_nickname
field to your Greeting
model (and keep its value up to date with author.nickname
):
class Greeting(db.Model):
author = db.UserProperty()
author_nickname = db.StringProperty() # denormalization (copy of author.nickname)
content = db.StringProperty(multiline = True)
date = db.DateTimeProperty(auto_now_add=True)
If you add this sort of denormalization to your model, it might be helpful to use Nick Johnson's aetycoon library to make author_nickname
update whenever author
is updated (just so you don't have to manually enforce that relationship).
精彩评论