Я не совсем понимаю, как фильтровать и отображать отношения один-ко-многим.
После этого вопроса и этой статьи ( и мой предыдущий вопрос ) я создал новый ReferenceProperty Tag
в дополнение к Item
:
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
, и теперь таблица выглядит так:
Key: ahNzYz...
ID: 269
Key Name:
item: ahNzYXJh...
Item: id=268
tag: glam
Key: ahNxyz...
ID: 270
Key Name:
item: ahNzYXJh...
Item: id=264
tag: casual
В моем 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'
Я пробовал другие комбинации безуспешно. Буду признателен, если кто-нибудь сможет объяснить, как это работает, чтобы я понял, как просмотреть результаты.
Спасибо.
Обновление
Я попробовал ответ Даниэля Роземана так:
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
идентификатор указанного элемента хранится в столбце 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()
возвращает ключ предмета, который мне нужно использовать. Как я могу получить url
и title
и т.д. этого предмета? И как мне это отобразить?
Обновление 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()
Я должен назвать этот предмет как-то еще:
item = Item.get(referenced_item_key)