2

我有一個設計問題是BlobReferenceProperty基本上ReferenceProperty?我應該像ReferenceProperty一樣執行預取(由Nick http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine建議)嗎?BlobReferenceProperty和ReferenceProperty模型設計

目前我有這樣的設計:

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) 

謝謝。

回答

1

Blobreference屬性與db.ReferenceProperty類似,除了實體實際位於Blobstore中。所以預取ReferenceProperty也適用於BlobReferenceProperty。 blobstore.py還包含get_value_for_datastore,您可以使用它來預取blob實體。

回到第二個問題,將blob移到Entry中,這取決於您的功能。

+0

這在技術上並非如此。存儲在BlobReferenceProperty上的BlobKey實際上指向一個BlobInfo實體,而不直接指向Blobstore。 BlobInfo只是一個常規的數據存儲實體,它擁有關於Blob的信息並提供一個API來獲取它。答案仍然存在,仍然可以預取BlobKey,當你不需要它時可以跳過BlobInfo步驟。 – 2011-05-24 13:34:36

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