如何对作为StringListProperty()的查询对象进行排序?

时间:2011-02-06 21:41:12

标签: python google-app-engine sorting

我有这个型号:

class ArticleTagList(db.Model):
    article_tags = db.StringListProperty()

EditArticleHandler我这样做:

        tag_query = ArticleTagList.all()

        for tag in tag_query:
            for i in range(len(tag.article_tags)):

                self.response.out.write(""" <span id="small-tags">
                <input type="checkbox" name="article_tag" value="%s">%s  </span>"""
                 % (tag.article_tags[i], tag.article_tags[i]))

但是以字母顺序打印这些标签会很不错。

当然在尝试

        tag_query.sort()

给出

AttributeError: 'Query' object has no attribute 'sort'

如何对查询列表进行排序?感谢。

更新

感谢您的回答。我很难理解查询结果,所以不确定我理解下面的评论;但这就是我解决它的方式,我很感激评论为什么这是一个很好的解决方案,或者为什么它不是一个好的解决方案。 (例如,使用range()进行迭代仍然是错误的吗?)谢谢!

    query = ArticleTagList.all()
    items = query.get()

    items.article_tags.sort()

    for i in range(len(items.article_tags)):
        self.response.out.write(""" <span id="small-tags">
            <input type="checkbox" name="article_tag" value="%s">%s  </span>"""
             % (items.article_tags[i], items.article_tags[i]))

3 个答案:

答案 0 :(得分:2)

你可能想要:

    for article_tag_list in tag_query:
        article_tags = sorted(article_tag_list.article_tags)
        for tag in article_tags:
            self.response.out.write("""<span id="small-tags">
            <input type="checkbox" name="article_tag" value="%s">%s  </span>"""
             % (tag, tag))

答案 1 :(得分:1)

请不要通过执行for i in range(len(tag.article_tags))来遍历列表。没有理由这样做。 for tag in tag.article_tags效果更好,更像Pythonic。

要回答您的问题,请不要忘记您在此处有两个类似列表的内容:ArticleTagList个实例集以及每个实例中的article_tags列表。您是否尝试对所有标签进行排序,无论它们位于哪个标签列表中?在这种情况下,您需要将它们全部加入一个大清单中:

full_list = []
for tag in tag_query:
    full_list.extend(list(tag.article_tags))

full_list.sort() 

答案 2 :(得分:1)

听起来你正在尝试按顺序打印标签,但是你试图对实例进行排序。你应该做这样的事情:

for taglist in tag_query:
  for tag in sorted(taglist.article_tags):
    #...

但鉴于您可能总是希望它们按排序顺序排列,在创建实体时,在存储实体之前调用taglist.article_tags.sort()会更容易,以确保标记按排序顺序存储