开发者

Cannot access members of UserProperty in code

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).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜