App Engine 通过实例本身在重复的 KeyProperty 中编辑实例
App Engine editing an instance in a repeated KeyProperty via the instance itself
假设我有以下型号:
class Author(ndb.Model)
books = ndb.KeyProperty(kind='Book', repeated=True)
class Book(ndb.Model)
title = ndb.StringProperty()
所以在某个时候,你会有一个作者列出 n
本书。
问题:
当我编辑一本书时,如何在不参考 'current' 作者的情况下更改作者?我是否需要在 Book
上添加与 KeyProperty
的反向关系?
更改作者时,我必须将这本书从旧作者列表中删除并将其添加到新作者列表中。感觉有点麻烦有没有更好的方法?
奖金问题:如果一本书被删除了怎么办?作者的图书列表中会有一个 None
值。我必须删除它吗?
注意:我使用了重复的 KeyProperty,因为这使得订购书籍变得容易,这对我来说很重要。
When I'm editing a book how do I change the author without a reference to the 'current' author?
您可以在保存实体之前使用ndb.Model.allocate_ids
预留密钥
Do I need to add a reverse relation with a KeyProperty on Book?
鉴于您的模型,添加反向查找键可以让您的生活更轻松
What if a book gets deleted? There will be a None value in the author's books list. Do I have to remove that?
Auther.books
中的key在这种情况下不会自动变为null。你必须自己删除它。
I'm using a repeated KeyProperty because this makes ordering the books easy, which in my case is important.
一个潜在的问题是实体的大小限制为 1mb。如果作者是非常多产的作家(例如 Edwy Searles Brooks 有 800 多部作品),则可以超过限制。
我会这样设计模型:
class Author(ndb.Model):
name = ndb.StringProperty()
class Book(ndb.Model):
authors = ndb.KeyProperty('Author', required=True) # Usually it is at most a couple of authors
title = ndb.StringProperty()
要查找 ID 为 1234 的特定作者所写的所有书籍,您可以
Book.query(Book.authors == ndb.Key('Author', 1234)).fetch()
显然必须明确存储书籍的顺序,我建议使用第三方实体来跟踪此信息:
class BookList(ndb.Model):
name = ndb.StringProperty()
book_keys = ndb.KeyProperty(kind='Book', repeated=True)
然后就可以通过这种方式取书了
stephen_king_book_list = stephen_king_book_list_key.get()
books = ndb.get_multi(stephen_king_book_list.book_keys)
# Some of key can lead to None if the underlying book is already deleted
# You can define some background job to sweep clean the list from time to time
# But let filter out the bad guys first
books = [b for b in books if b]
如果您认为您的列表会非常非常长,您可以像链表结构一样将列表分解成多个部分
class BookList(ndb.Model):
prev_segment = ndb.KeyProperty(kind='BookList', required=False)
next_segment = ndb.KeyProperty(kind='BookList', required=False)
name = ndb.StringProperty()
book_keys = ndb.KeyProperty(kind='Book', repeated=True)
您可以通过以下方式轻松找到拳头段:
starting_point = BookList.query(BookList.name == 'Stephen_King',
BookList.prev_segment == None
).fetch()
当然如果插入很频繁,你可能想用另一种结构来保存图书列表
你的人际关系真的不对。您应该在 Book 上有一个指向 Author 的 KeyProperty;那么如果你想查询一个作者的所有书籍,你可以查询 Author 键。
假设我有以下型号:
class Author(ndb.Model)
books = ndb.KeyProperty(kind='Book', repeated=True)
class Book(ndb.Model)
title = ndb.StringProperty()
所以在某个时候,你会有一个作者列出 n
本书。
问题:
当我编辑一本书时,如何在不参考 'current' 作者的情况下更改作者?我是否需要在 Book
上添加与 KeyProperty
的反向关系?
更改作者时,我必须将这本书从旧作者列表中删除并将其添加到新作者列表中。感觉有点麻烦有没有更好的方法?
奖金问题:如果一本书被删除了怎么办?作者的图书列表中会有一个 None
值。我必须删除它吗?
注意:我使用了重复的 KeyProperty,因为这使得订购书籍变得容易,这对我来说很重要。
When I'm editing a book how do I change the author without a reference to the 'current' author?
您可以在保存实体之前使用ndb.Model.allocate_ids
预留密钥
Do I need to add a reverse relation with a KeyProperty on Book?
鉴于您的模型,添加反向查找键可以让您的生活更轻松
What if a book gets deleted? There will be a None value in the author's books list. Do I have to remove that?
Auther.books
中的key在这种情况下不会自动变为null。你必须自己删除它。
I'm using a repeated KeyProperty because this makes ordering the books easy, which in my case is important.
一个潜在的问题是实体的大小限制为 1mb。如果作者是非常多产的作家(例如 Edwy Searles Brooks 有 800 多部作品),则可以超过限制。
我会这样设计模型:
class Author(ndb.Model):
name = ndb.StringProperty()
class Book(ndb.Model):
authors = ndb.KeyProperty('Author', required=True) # Usually it is at most a couple of authors
title = ndb.StringProperty()
要查找 ID 为 1234 的特定作者所写的所有书籍,您可以
Book.query(Book.authors == ndb.Key('Author', 1234)).fetch()
显然必须明确存储书籍的顺序,我建议使用第三方实体来跟踪此信息:
class BookList(ndb.Model):
name = ndb.StringProperty()
book_keys = ndb.KeyProperty(kind='Book', repeated=True)
然后就可以通过这种方式取书了
stephen_king_book_list = stephen_king_book_list_key.get()
books = ndb.get_multi(stephen_king_book_list.book_keys)
# Some of key can lead to None if the underlying book is already deleted
# You can define some background job to sweep clean the list from time to time
# But let filter out the bad guys first
books = [b for b in books if b]
如果您认为您的列表会非常非常长,您可以像链表结构一样将列表分解成多个部分
class BookList(ndb.Model):
prev_segment = ndb.KeyProperty(kind='BookList', required=False)
next_segment = ndb.KeyProperty(kind='BookList', required=False)
name = ndb.StringProperty()
book_keys = ndb.KeyProperty(kind='Book', repeated=True)
您可以通过以下方式轻松找到拳头段:
starting_point = BookList.query(BookList.name == 'Stephen_King',
BookList.prev_segment == None
).fetch()
当然如果插入很频繁,你可能想用另一种结构来保存图书列表
你的人际关系真的不对。您应该在 Book 上有一个指向 Author 的 KeyProperty;那么如果你想查询一个作者的所有书籍,你可以查询 Author 键。