Разработка модели BlobReferenceProperty и ReferenceProperty ReferenceProperty

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