How to query datastore when using ReferencePropert

2019-04-14 09:12发布

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")
    venue = 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.

2条回答
来,给爷笑一个
2楼-- · 2019-04-14 09:35

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)
查看更多
\"骚年 ilove
3楼-- · 2019-04-14 09:43

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.

查看更多
登录 后发表回答