【问题标题】:BlobReferenceProperty and ReferenceProperty model designBlobReferenceProperty 和 ReferenceProperty 模型设计
【发布时间】:2011-05-24 11:01:33
【问题描述】:

我有一个设计问题是 BlobReferenceProperty 基本上是 ReferenceProperty?我应该像 ReferenceProperty 那样进行预取(由 Nick http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine 建议)吗?

目前我有这个设计:

class Entry(db.Model):
  creator     = db.ReferenceProperty(User, required=True, collection_name='entries')
  created_at  = db.DateTimeProperty(auto_now_add=True)

  # image
  image_id    = db.StringProperty() # key_name for Image
  image_url   = db.LinkProperty(indexed=False)
  width       = db.IntegerProperty(default=0, indexed=False)
  height      = db.IntegerProperty(default=0, indexed=False)


class Image(db.Model):
  created_at    = properties.DateTimeProperty(auto_now_add=True)
  blob          = blobstore.BlobReferenceProperty(required=True)
  filename      = db.StringProperty(indexed=False)
  published     = db.BooleanProperty(default=False, indexed=True)
  width         = db.IntegerProperty(default=0, indexed=False)
  height        = db.IntegerProperty(default=0, indexed=False)

这会更好还是更糟?我已将 blob 移至 Entry。

class Entry(db.Model):
  creator     = db.ReferenceProperty(User, required=True, collection_name='entries')
  created_at  = db.DateTimeProperty(auto_now_add=True)

  # image     
  image_blob  = blobstore.BlobReferenceProperty(required=False)
  filename    = db.StringProperty(indexed=False)
  image_id    = db.StringProperty()
  image_url   = db.LinkProperty(indexed=False)
  width       = db.IntegerProperty(default=0, indexed=False)
  height      = db.IntegerProperty(default=0, indexed=False)

谢谢。

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore blobstore referenceproperty


    【解决方案1】:

    Blobreference 属性与 db.ReferenceProperty 类似,但实体实际上位于 blobstore 中。所以预取 ReferenceProperty 也适用于 BlobReferenceProperty。 blobstore.py 还包含 get_value_for_datastore,您可以使用它来预取 blob 实体。

    谈到你的第二个问题,将 blob 移动到 Entry ,这取决于你的功能。

    【讨论】:

    • 这在技术上是不正确的。存储在 BlobReferenceProperty 上的 BlobKey 实际上指向 BlobInfo 实体,而不是直接指向 blobstore。 BlobInfo 只是一个常规的数据存储实体,它保存有关您的 Blob 的信息并提供一个 API 来获取它。答案仍然存在,仍然可以预取 BlobKey,这对于在不需要时跳过 BlobInfo 步骤很有用。
    【解决方案2】:

    如果您需要条目和图像之间的一对多关系,如果您希望每个条目能够匹配许多图像,则可以使用类似于您的第一个模型的东西。我使用的关系有点像这样:

    class Article(db.Model):      
        user=db.UserProperty(verbose_name="userid") 
    
    class Image(db.Model):       
        reference=db.ReferenceProperty(Article,collection_name='matched_images')
        primary_image = blobstore.BlobReferenceProperty() 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2018-10-06
      相关资源
      最近更新 更多