我的模型看起来像这样:
class Example (db.Model) :
name = db.StringProperty()
tags = db.StringListProperty()
我首先查询标签以获取包含它们的实体列表:
results = Example.all().filter("tags =", tagSearch).fetch(100)
这给了我一个在“标签”列表中包含“tagSearch”的实体列表。
以下是结果实体样本的样子:
entityA = [tagSearch, m, n, o, ....]
entityB = [a, b, c, tagSearch, ... ]
entityC = [a, tagSearch, a, ,a ,x ....... ....]
我想根据项目tagSearch的位置,按降序对结果集中的所有实体进行排序。
basically - entityA, entityC, entityB
我该怎么做?请注意我在appengine上运行...
也假设比tagSearch在任何列表中只出现一次。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
我能想到的唯一方法是修改标记列表以包含位置,并使用不等式过滤器。例如,您可以将标记修改为“tag:ordinal”格式,其中ordinal是列表中的位置(entityA因此具有["tagSearch:0", "m:1", "n:2", "o:3"]
)。然后,不执行相等过滤器,而是执行如下的查询:
results = Example.all().filter("tags >=", tagSearch + u":").filter("tags <", tagSearch + u":\ufffd").fetch(100)
因此,结果集将按搜索标签在列表中出现的位置排序。缺点是您现在一次只能查询一个标签 - 在App Engine中无法使用多个不等式过滤器。
答案 1 :(得分:1)
据我所知,您无法在查询中对这些进行排序。因此,唯一的选择是获取所有内容并在代码中对其进行相应的排序。
这可能不太可行,具体取决于您必须返回的实体数量,因此您可能希望在获取之前以其他方式限制实体。
答案 2 :(得分:1)
我同意杰森·霍尔的观点,鉴于你的模型,它不适用于查询。
您可以尝试将模型更改为以下内容:
class Example (db.Model) :
name = db.StringProperty()
class ExampleTag(db.Model):
example_id = db.IntegerProperty()
tag_name = db.StringProperty()
tag_rank = db.IntegerProperty()
然后你运行你的查询:
query = ExampleTag.all()
query.filter('tag_name =', 'tagSearch')
query.order('tag_rank')
tags = query.fetch(100)
examples = Example.get_by_ids([x.example_id for x in tags])