你会使用这样的东西来查询 ID: review = Review.get_by_id(book.key.id())
。
您设置 ID 的方法仅适用于书籍和评论之间存在 1 对 1 关系的情况,因为键是唯一的。上述操作只会返回一个实体。
我建议将最常用的查询设置为审查的祖先。我的猜测是,除非您的用户是著名的评论家,否则他的书评所属的书在这里是最相关的。
如果您将 Review 的父级设置为 Book,则可以使用Ancestor 查询来获取所有具有保证一致性的评论。然后用户可以是评论的属性,您可以简单地按该属性进行过滤。我建议使用 KeyProperty 作为参考。
如果您希望保证用户查询的一致性,请为每个用户保留一个评论书籍列表(重复 KeyProperty),然后针对评论运行祖先查询,由该用户过滤。
更新:@JimmyKane 是对的 - get_by_id 根本不起作用,因为它显然需要指定父级,在你的情况下这似乎不太实用。
证明 get_by_id 不起作用的代码:
from flask import Flask
from google.appengine.ext import ndb
app = Flask(__name__)
class User(ndb.Model):
name = ndb.StringProperty()
class Book(ndb.Model):
name = ndb.StringProperty()
class Review(ndb.Model):
name = ndb.StringProperty()
@app.route('/')
def hello_main():
user = User()
user.name = 'Test User1'
user.put()
book = Book()
book.name = 'Test Book1'
book.put()
review = Review(id=book.key.id(), parent=user.key)
review.name = 'Test Review1'
review.put()
return 'Review saved!'
@app.route('/reviews/')
def reviews():
book = Book.query(Book.name == 'Test Book1').get()
user = User.query(User.name == 'Test User1').get()
if book:
review = Review.get_by_id(book.key.id(), parent=user.key)
if review:
return review.name
else:
return 'no review'
else:
return 'no books'
if __name__ == "__main__":
app.run()
这是我推荐的方法的示例代码:
from flask import Flask
from google.appengine.ext import ndb
class User(ndb.Model):
name = ndb.StringProperty()
reviews = ndb.KeyProperty(repeated=True)
class Book(ndb.Model):
name = ndb.StringProperty()
class Review(ndb.Model):
name = ndb.StringProperty()
app = Flask(__name__)
@app.route('/')
def hello_main():
user = User()
user.name = 'Test User1'
user.put()
book = Book()
book.name = 'Test Book1'
book.put()
review = Review(parent=book.key)
review.name = 'Test Review1'
review.put()
user.reviews.append(review.key)
user.put()
return 'Review saved!'
@app.route('/add_review/')
def add_review():
book = Book.query(Book.name == 'Test Book1').get()
user = User.query(User.name == 'Test User1').get()
if book:
review = Review(parent=book.key)
review.name = 'Test Review'
review.put()
user.reviews.append(review.key)
user.put()
return 'review added'
else:
return 'no books'
@app.route('/reviews/')
def reviews():
book = Book.query(Book.name == 'Test Book1').get()
user = User.query(User.name == 'Test User1').get()
if book:
reviews = Review.query(ancestor=book.key)
for review in reviews:
print(review.name)
print('<br/>')
return ''
else:
return 'no books'
@app.route('/reviews_by_user/')
def reviews_by_user():
user = User.query(User.name == 'Test User1').get()
for review_key in user.reviews:
review = review_key.get()
print(review.name)
print('<br/>')
return ''
if __name__ == "__main__":
app.run()