开发者

How to query datastore when using ReferenceProperty?

开发者 https://www.devze.com 2023-01-27 19:28 出处:网络
I am trying to understand the 1-to-many relationships in datastore; but I fail to understand how query and update the record of a user when the model includes ReferenceProperty. Say I have this model:

I am trying to understand the 1-to-many relationships in datastore; but I fail to understand how query and update the record of a user when the model includes ReferenceProperty. Say I have this model:

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")
    ve开发者_StackOverflow中文版nue = db.StringProperty()

If I understand correctly, the same user, uniquely identified by userEmail can have many comments and may be associated with many venues (restaurants etc.)

Now, let's say the user az@example.com is already in the database and he submits a new entry.

Based on this answer I do something like:

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

But I am not clear what this does! What I want to do is to update comment and venue fields which are under class Comment and class Venue.

Can you help me understand how this works? Thanks.


The snippet you posted is doing this (see comments):

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

After this code the_user will be an object that corresponds to the user record with email "az@example.com". Seing you've set up your reference properties, you can access its comments and venues with the_user.comments and the_user.venues. Some venue of these can be modified, say like this:

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

I suggest that you make a general sweep of the gae documentation that has very good examples, you will find it very helpful: http://code.google.com/appengine/docs/python/overview.html

** UPDATE **: For adding new venue to user, simply create new venue and assign the queried user object as the venue's user attribute:

new_venue = Venue(venue='Jeferson memorial', user=the_user) # careful with the quoting
db.put(new_venue)


To get all Comments for a given user, filter the user property using the key of the user:

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

So you could first lookup the user by the email, and then search comments or venues using its key.

0

精彩评论

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

关注公众号