Модель отношения к HTML-шаблону - PullRequest
0 голосов
/ 12 декабря 2010

Я боролся за эту проблему в течение нескольких часов - я знаю, что, возможно, есть простое решение, которое я пропускаю.

У меня есть отношения один-ко-многим с моими моделями.

Мне нужно вернуть все строки одного объекта со строками для связанного объекта.

В некотором смысле у меня есть это:

 object 
 object
   object_relationship.property
   object_relationship.property
object
   object_relationship.property
object

Теперь - я могу пройти через всеэто нормально, но я сталкиваюсь с проблемой, когда хочу отправить их обратно в html-шаблон.

Я могу отправить объект обратно - но как мне отправить object_relationship обратно в том порядке, в котором он у меня есть выше??

Имеет ли это смысл?

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

Возможно, вам не нужно слишком беспокоиться об этом, остро ... посмотрите на эти модели:

class Venue(base.NamedEntity, HasPerformances, HasUrl, HasLocation):
    city = db.ReferenceProperty(City, collection_name='venues')
    url = db.StringProperty(required=True, validator=validators.validate_url)
    location = db.GeoPtProperty()

class Performance(base.Entity):
    show = db.ReferenceProperty(Show, collection_name='performances', required=True)
    utc_date_time = db.DateTimeProperty(required=True)
    venue = db.ReferenceProperty(Venue, collection_name='performances', required=True)

В таком случае ничто не мешает вам использовать venue.performances из кода или шаблонов и рассматривать его как список. API будет автоматически запускать запросы по мере необходимости для извлечения реальных объектов. То же самое относится и к performance.venue.

Единственная проблема здесь - производительность - у вас есть вариант проблемы n + 1 для решения. Однако есть обходные пути, например эта статья Ника Джонсона. Я бы посоветовал также прочитать код API ... это интересно для того, чтобы узнать, как получить и получить разыменование свойства.

0 голосов
/ 12 декабря 2010

Мое первое предложение - денормализовать данные, если вы собираетесь делать много подобных отчетов.Например, может быть, вы могли бы включить object.name в сущности object_relationship.

Тем не менее, вы можете отправить список диктов к вашему шаблону, так что может быть что-то вроде:

data = []
for entity in your_query:
   children = [{'name': child.name} for child in entity.object_relation]
   data.append({'name': object.name,
                'children': children,
                 ...
               })

Затем передайте список data в шаблон и обработайте его.

Обратите внимание, это будет работать очень плохо.Он выполнит еще один запрос для каждого одного из элементов в вашем первом запросе.Используйте Appstats для профилирования вашего приложения.

...