【问题标题】:How can I query for records based on an attribute of a ReferenceProperty? (Django on App Engine)如何根据 ReferenceProperty 的属性查询记录? (App Engine 上的 Django)
【发布时间】:2010-10-15 05:59:07
【问题描述】:

如果我在 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)

但查询不匹配任何内容,这告诉我我走错了路。

【问题讨论】:

    标签: python django google-app-engine google-cloud-datastore


    【解决方案1】:

    你不能。应用引擎不支持联接。

    一种方法是手动实现连接。例如,您可以获取所有照片,然后在代码中过滤掉私人照片。或者获取所有公共相册,然后获取他们的每张照片。这取决于您的数据是否可以正常运行。

    另一种方法是对数据进行非规范化。在 Photo 模型中放置另一个字段,例如:

    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 字段。这取决于您的数据和读/写模式,这会更好还是更差。

    【讨论】:

    • 非常感谢您的深思熟虑的回复 - 我已经实施了替代方法,只需要小心保持 album_private 更新!
    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-08-17
    • 2012-04-07
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多