#python #google-app-engine #google-cloud-datastore #blobstore #referenceproperty
#python #google-app-engine #google-облачное хранилище данных #blobstore #referenceproperty
Вопрос:
У меня есть вопрос о дизайне, является ли BlobReferenceProperty в основном ReferenceProperty? Должен ли я выполнять предварительную выборку (предложено Ником http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine ) нравится 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)
Было бы это лучше или хуже? Вместо этого я переместил большой двоичный объект в 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.
Переходя к вашему второму вопросу о перемещении большого двоичного объекта в Entry , это зависит от вашей функциональности.
Комментарии:
1. Технически это неверно. BlobKey, хранящийся в BlobReferenceProperty, фактически указывает на объект BlobInfo, а не непосредственно на blobstore. BlobInfo — это просто обычный объект хранилища данных, который содержит информацию о вашем большом двоичном объекте и предоставляет 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()