1

我对谷歌应用引擎很陌生。我知道谷歌数据存储不是 sql,但我试图在其中获得多对多的关系行为。正如您在下面看到的,我有 Gif 实体和 Tag 实体。我希望我的应用程序通过相关标签搜索 Gif 实体。这是我所做的;

class Gif(ndb.Model):
    author = ndb.UserProperty()
    link = ndb.StringProperty(indexed=False)

class Tag(ndb.Model):
    name = ndb.StringProperty()

class TagGifPair(ndb.Model):
    tag_id = ndb.IntegerProperty()
    gif_id = ndb.IntegerProperty()

    @classmethod
    def search_gif_by_tag(cls, tag_name)
        query = cls.query(name=tag_name)
        # I am stuck here ...

这是一个正确的开始吗?如果是这样,我该如何完成它。如果没有,怎么办?

4

3 回答 3

2

您可以使用重复属性https://developers.google.com/appengine/docs/python/ndb/properties#repeated链接中的示例使用带有实体的标签作为示例,但对于您的确切用例将如下所示:

class Gif(ndb.Model):
    author = ndb.UserProperty()
    link = ndb.StringProperty(indexed=False)
    # you store array of tag keys here you can also just make this
    # StringProperty(repeated=True)
    tag = ndb.KeyProperty(repeated=True)

    @classmethod
    def get_by_tag(cls, tag_name):
        # a query to a repeated property works the same as if it was a single value
        return cls.query(cls.tag == ndb.Key(Tag, tag_name)).fetch()

# we will put the tag_name as its key.id()
# you only really need this if you wanna keep records of your tags
# you can simply keep the tags as string too
class Tag(ndb.Model):
    gif_count = ndb.IntegerProperty(indexed=False)
于 2013-09-12T22:40:51.490 回答
0

也许你想使用列表?如果您只需要按标签搜索 gif,我会做这样的事情。我正在使用 db,因为我不熟悉 ndb。

class Gif(db.Model):
    author = db.UserProperty()
    link = db.StringProperty(indexed=False)
    tags = db.StringListProperty(indexed=True)

像这样查询

Gif.all().filter('tags =', tag).fetch(1000)
于 2013-09-12T22:44:36.837 回答
0

建立多对多关系有不同的方式。使用 ListProperties 是一种方法。如果使用 ListProperties,要记住的限制是每个实体的索引数量有限制,并且总实体大小有限制。这意味着列表中的实体数量有限制(取决于您是先达到索引计数还是实体大小)。请参阅本页底部:https ://developers.google.com/appengine/docs/python/datastore/overview

如果您认为引用的数量将在此限制内起作用,那么这是一个不错的方法。考虑到您不会有成千上万的主页管理员,这可能是正确的方法。

另一种方法是拥有一个中间实体,该实体具有对多对多双方的引用属性。这种方法可以让你扩展得更高,但是由于所有额外的实体写入和读取,这要昂贵得多。

于 2013-09-13T01:39:53.197 回答