BlobReferenceProperty和ReferenceProperty模型设计

2 投票
2 回答
681 浏览
提问于 2025-04-16 18:14

我有个设计问题,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)

谢谢。

2 个回答

0

如果你想让每个条目可以对应多张图片,也就是说条目和图片之间有一种一对多的关系,你可以使用类似于你最初模型的东西。我用的就是这种关系:

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() 
1

BlobReference属性和db.ReferenceProperty很像,唯一不同的是,BlobReference属性指向的实体实际上存储在blobstore里。所以,像预取ReferenceProperty那样的操作也适用于BlobReferenceProperty。此外,blobstore.py里还有一个叫get_value_for_datastore的功能,可以用来预取blob实体。

至于你第二个问题,关于把blob移动到Entry,这要看你的具体功能需求。

撰写回答