Как просмотреть результаты запроса отношений один-ко-многим? - PullRequest
0 голосов
/ 28 января 2011

Я не совсем понимаю, как фильтровать и отображать отношения один-ко-многим.

После этого вопроса и этой статьи ( и мой предыдущий вопрос ) я создал новый 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)

1 Ответ

1 голос
/ 28 января 2011

Вам нужно две петли здесь.query - список объектов Tag.У каждого объекта есть список предметов.Таким образом, вам нужно пройтись по query, а затем по элементам каждого тега.

Однако есть вторая проблема: ReferenceProperty неверен.Насколько я понимаю, ReferenceProperty похож на ForeignKey в обычном Django: другими словами, отношение один-ко-многим, где модель, определяющая свойство, является стороной «один» отношения.Но вам, кажется, нужно несколько элементов для каждого тега, через которые вы затем проходите цикл: вам нужно поместить 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')
...