Как я могу запросить записи на основе атрибута ReferenceProperty?(Джанго на App Engine) - PullRequest
1 голос
/ 15 октября 2010

Если у меня есть следующие модели в приложении Python (+ Django) App Engine:

class Album(db.Model):
  private = db.BooleanProperty()
  ...

class Photo(db.Model):
  album = db.ReferenceProperty(Album)
  title = db.StringProperty()

... как я могу получить все фотографии, которые принадлежат общедоступному альбому (то есть альбому с частным == False)?

Чтобы более подробно объяснить мое намерение, я подумал, что это будет:

public_photos = Photos.all().filter('album.private = ', False)

и тогда я мог бы сделать что-то вроде:

photos_for_homepage = public_photos.fetch(30)

но запрос ничего не соответствует, что говорит мне, что я иду по неправильному пути.

1 Ответ

4 голосов
/ 15 октября 2010

Вы не можете. Движок приложения не поддерживает объединения.

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

Альтернативный подход заключается в денормализации ваших данных. Поместите другое поле в фото модель, например:

class Photo(db.Model): 
  album = db.ReferenceProperty(Album) 
  album_private = db.BooleanProperty()
  title = db.StringProperty() 

Затем вы можете отфильтровать общедоступные фотографии с помощью:

public_photos = Photos.all().filter('album_private = ', False)

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

...