2

J'ai une question de conception est BlobReferenceProperty essentiellement ReferenceProperty? Dois-je faire prefetch (suggéré par Nick http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine) comme pour ReferenceProperty?BlobReferenceProperty et ReferenceProperty modèle design

Actuellement, j'ai cette conception:

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) 

Serait-ce mieux ou pire? J'ai déplacé le blob à l'entrée à la place.

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) 

Merci.

Répondre

1

La propriété de référence blob est similaire à db.ReferenceProperty, à l'exception du fait que l'entité se trouve réellement dans le blobstore. Donc, préextraire ReferenceProperty s'applique également à BlobReferenceProperty. blobstore.py inclut également get_value_for_datastore à l'aide duquel vous pouvez pré-lire les entités blob. Pour répondre à votre deuxième question, en déplaçant le blob vers l'entrée, cela dépend de votre fonctionnalité.

+0

Ce n'est pas techniquement vrai. Le BlobKey stocké sur le BlobReferenceProperty pointe en fait vers une Entité BlobInfo qui n'est pas directement dans le blobstore. BlobInfo est juste une entité de banque de données régulière qui contient des informations sur votre objet blob et fournit une API pour le récupérer. La réponse est toujours la même que, peut encore pré-charger le BlobKey qui peut être utile pour passer l'étape BlobInfo lorsque vous n'en avez pas besoin. –

0

Vous pouvez utiliser quelque chose comme vos premiers modèles si vous avez besoin d'une relation un-à-plusieurs entre l'entrée et l'image, si vous voulez que chaque entrée puisse correspondre à de nombreuses images. J'utilise une relation un peu comme ça:

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