Как вы храните объект изображения движка приложения в БД? - PullRequest
1 голос
/ 18 апреля 2009

Я немного застрял с моим кодом:

def setVenueImage(img):
  img = images.Image(img.read())
  x, y = photo_utils.getIdealResolution(img.width, img.height)
  img.resize(x, y)
  img.execute_transforms()
  venue_obj = getVenueSingletonObject()
  if venue_obj is None:
      venue_obj = Venue(images = [img])
  else:
      venue_obj.images.append(img)
  db.put(venue_obj)

Я использую django с движком приложения, поэтому img.read () работает нормально.

На самом деле весь этот код работает нормально, пока я не попытаюсь сохранить img в базе данных. Моя модель ожидает BLOB-объект, поэтому, когда я вставляю изображение в виде img, оно подходит, и я получаю:

BadValueError в / admin / place / Все элементы в списке изображений должны быть экземплярами Blob

Хорошо, значит, изображение не должно быть BLOB-объектом, но как мне сделать его BLOB-объектом? Blob-объекты принимают байтовую строку, но как сделать мое изображение байтовой строкой?

Я не видел нигде в документах, где они на самом деле используют объекты изображений, поэтому я не уверен, как это все должно работать, но я хочу использовать объекты изображений для изменения размера моего image (я знаю, что вы можете сделать это в PIL, но я хотел бы знать, как это сделать с помощью класса Google изображения).

Спасибо за любые указатели:)

Ответы [ 3 ]

2 голосов
/ 18 апреля 2009

Я не доволен этим решением, так как оно не преобразует объект Image в BLOB-объект, но пока подойдет:

def setVenueImage(img):
  original = img.read()
  img = images.Image(original)
  x, y = photo_utils.getIdealResolution(img.width, img.height)
  img = images.resize(original, x, y)
  venue_obj = getVenueSingletonObject()
  if venue_obj is None:
      venue_obj = Venue(images = [db.Blob(img)])
  else:
      venue_obj.images.append(db.Blob(img))
  db.put(venue_obj)
2 голосов
/ 23 мая 2009

Это, вероятно, будет работать:

def setVenueImage(img):
  img = images.Image(img.read())
  x, y = photo_utils.getIdealResolution(img.width, img.height)
  img.resize(x, y)
  img_bytes = img.execute_transforms() # Converts to PNG
  venue_obj = getVenueSingletonObject()
  if venue_obj is None:
      venue_obj = Venue(images = [img_bytes])
  else:
      venue_obj.images.append(img_bytes)
  db.put(venue_obj)

Я предполагаю, что Venue.images является ListProperty (db.Blob), правильно? Это, вероятно, неправильно. Определите модель VenueImage с помощью простого свойства blob и сохраните его ключ в Venue. Если вы поместите изображения туда напрямую, вы достигнете предела строки 1 МБ в хранилище данных.

0 голосов
/ 18 апреля 2009

http://code.google.com/appengine/docs/python/images/usingimages.html

Я думаю, что ссылка должна помочь. Удачи.

...