Python 2.7 谷歌应用引擎:创建实体类别

Python 2.7 谷歌应用引擎:创建实体类别,python-2.7,categories,app-engine-ndb,Python 2.7,Categories,App Engine Ndb,我有一本实体类的书(ndb.Model): class Book(ndb.Model): title = ndb.StringProperty(required = True) 每一本书都应该根据其类型在预定义的类别中进行“分类”(例如:“恐怖”、“幻想”、“浪漫”等) 我希望建立一个流派链接菜单,如下所示: <ul> <li><a href="/genre/horror">Horror</a></li> &l

我有一本实体类的书(ndb.Model)

class Book(ndb.Model):
    title = ndb.StringProperty(required = True)
每一本书都应该根据其类型在预定义的类别中进行“分类”(例如:“恐怖”、“幻想”、“浪漫”等)

我希望建立一个流派链接菜单,如下所示:

<ul>
    <li><a href="/genre/horror">Horror</a></li>
    <li><a href="/genre/fantasy">Fantasy</a></li>
    <li><a href="/genre/romance">Romance</a></li>
</ul>
然而,这种方法似乎没有太大的可扩展性和适应性;也就是说,如果我想包含一个新类别,我需要手动编辑
类书(ndb.Model)
以及流派链接菜单,以及用于创建和编辑书籍实体的表单。例如:

# new-book.html
<form method="post">

    <label>Book Title:<br><input type="text" name="title"></label>

    <label>Genres:<br>
            <input type="checkbox" name="genre" value="horror">Horror<br>
            <input type="checkbox" name="genre" value="fantasy">Fantasy<br>
            <input type="checkbox" name="genre" value="romance">Romance<br>
            # Adding New Genre */
            <input type="checkbox" name="genre" value="mystery">Mystery<br>
    </label>
    <input type="submit">
</form>
#new-book.html
书名:
类型:
恐怖
幻想
浪漫
#添加新类型*/ 神秘

一定有更好的办法!谢谢你给我小费

您需要的是将属性设置为“重复”

class Book(ndb.Model):
    title = ndb.StringProperty(required = True)
    genre = ndb.StringProperty(repeated=True)
这将允许您添加和查询任意数量的类别


来源:

@haopei处理什么?什么意思?它是透明的。谢谢你的回答,rdodev。在这里使用这种方法的一个挑战是:在构建复选框时,您将如何构建“类型菜单链接”或查询所有类别的列表?例如,如果
example.com/book/1
[“神秘”、“恐怖”]
,而
example.com/book/2
[“浪漫”]
,那么您将如何查询这两本书的所有三个类别以用于构建链接菜单?这并不完全正确。使用重复属性发出相等查询时,它将匹配任何重复属性匹配的所有实体。如果要查询具有“浪漫”和“恐怖”类型的书籍,可以使用AND查询:GREEP==“浪漫”和GREEP==“恐怖”。如果你想要所有与浪漫或恐怖相匹配的书,你可以使用genre.in(['roman','Horror'])。有关重复的属性查询,请参见本页:。@PatrickCostello Right。我弄不清哪个是哪个。我以前做的那个项目,我们经常使用重复属性,所以是按记忆进行的,但你是对的。我将交换编辑我的评论以避免混淆。
bks=Book.query(Book.genre==“roman”).fetch()
将检索所有带有“roman”标记的书籍。我相信,您还可以查询Book.query(Book.genre.in(['roman',summary')).fetch(),它将检索所有标记为“roman”或“summary”的书籍。
class Book(ndb.Model):
    title = ndb.StringProperty(required = True)
    genre = ndb.StringProperty(repeated=True)