如何通过一个循环查询结果?

2024-04-25 14:44:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我对如何过滤和显示一对多关系感到困惑。在

this questionthis articleand my previous question)之后,除了Item,我还创建了一个新的ReferenceProperty Tag

class Item(db.Model):
    ...
    title = db.StringProperty()
    url = db.StringProperty()
    image_source_url = db.StringProperty()
    ....

class Tag(db.Model):
    item = db.ReferenceProperty(Item, collection_name = "image_tags")
    tag = db.StringProperty()

我向Tag添加了两个新项,现在表如下所示:

^{pr2}$

在我的SortFormHandler中,我执行此查询并尝试循环结果:

class SortFormHandler(webapp.RequestHandler):
    def get(self):        
        query = Tag.all()
        query.filter("tag", "glam")

        for item in query.image_tags:
            self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" % 
                                       (item.url, item.image_source_url, item.title)  )

这将导致属性错误:

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

我尝试了其他组合,但没有成功。如果有人能解释一下这是怎么工作的,我会很感激的,这样我就知道如何循环处理结果了。在

谢谢。在

更新

我试过丹尼尔·罗斯曼的answer像这样:

        for tag in query:
            self.response.out.write("tag is: %s" % tag.tag)
            for item in tag.image_tags:
                self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" % 
                                       (item.url, item.image_source_url, item.title)  )

但这给了

AttributeError: 'Tag' object has no attribute 'image_tags'

关于如何解决这个问题有什么建议吗?在

更新2

我看到在Tag表中,被引用项的ID存储在item列下。我怎么拿到那个身份证?我试过了

tag.item

在这一行

        for tag in query:
            self.response.out.write("tag is: %s. ID is: %s" % (tag.tag, tag.item))

但这只返回对象:

tag is: glam. ID is: <__main__.Item object at 0x06875EB0>

更新3

好的,我想好了如何获取引用项的键名:

        for tag in query:
            self.response.out.write(ID is: %s" % (tag.item.key()))

所以

tag.item.key()

返回我需要使用的项的键。如何获得该项的urltitle等?我如何显示它呢?在

更新4

这似乎有效(至少对1个标记):

for tag in query:
    referenced_item_key = tag.item.key()
    item = Item.get(referenced_item_key)
    self.response.out.write("""<a href="%s"><image src="%s" height="110">%s</a>""" % 
                                       (item.url, item.image_source_url, item.title)  )

注意:名称令人困惑,item引用Tag中的引用列:

    referenced_item_key = tag.item.key()

我应该给这个项目起个别的名字:

^{14}$

Tags: keyinimageselfurlfordbis
1条回答
网友
1楼 · 发布于 2024-04-25 14:44:33

这里需要两个回路。query是标记对象的列表。每个对象本身都有一个项目列表。所以您需要遍历query,然后遍历每个标记的项。在

然而,还有第二个问题:ReferenceProperty是错误的。据我所知,ReferenceProperty就像普通Django中的ForeignKey:换句话说,一个一对多关系,其中定义属性的模型是关系的“一”侧。但您似乎需要为每个标记添加多个项,然后循环遍历这些项:因此需要将ReferenceProperty放在项模型上。在

然后,您可以执行两个循环:

 for tag in query:
     self.response.out.write('header for tag %s' % tag.tag)
     for item in tag.image_tags:
         self.response.out.write('detail for each item')

相关问题 更多 >

    热门问题