编写NDB属性子类

时间:2012-09-25 12:44:53

标签: google-app-engine python-2.7 app-engine-ndb

我正在编写ImgProperty,我希望为用户提供一种定义默认高度和宽度的方法,如下所示:

class MyModel(ndb.Model):
  img = ImgProperty(height=32, width=32)

然后:

m = MyModel(img='https://example.com/my-photo')

然后将图像保存到db,调整大小为给定的高度,宽度值。 ImgProperty本身是BlobProperty的子类。我可以将这两个属性添加到Property._attributes中,从而使其工作吗?或者最好不要惹它?我认为这样做的另一种方法是创建一个具有字段高度和宽度的中间模型,并将__init__方法添加到ImgProperty。 像这样:

class ImgModel(ndb.Model):
  height = ndb.IntegerProperty()
  width = ndb.IntegerProperty()

class ImgProperty(ndb.BlobProperty):
  def __init__(self, **kwds):
        super(ImgProperty, self).__init__(ImgModel, **kwds)

我不确定这种方式是否允许定义img = ImgProperty(height=32, width=32)

2 个答案:

答案 0 :(得分:3)

我可以回答你关于构造函数签名的问题。你应该能够这样做:

class ImgProperty(ndb.BlobProperty):
  def __init__(self, height=32, width=32, **kwds):
    self.height = height
    self.width = width
    super(ImgProperty, self).__init__(**kwds)

对于其他人,我想您正在关注文档:https://developers.google.com/appengine/docs/python/ndb/subclassprop

我无法真正帮助你调整大小(使用图像api);但是我想知道在将数据存储到属性值之前是否最好不要手动调整大小调用,只是为了避免对图像api进行不必要的额外调整大小调整;自动属性转换非常强大,但有时可能会进行冗余调用。

祝你好运!

答案 1 :(得分:0)

您还可以保存包含大小的get_serving_url。通过这种方式,您可以使用Google高性能图片服务API,Google可以在其中提供图片。

来自doc:此URL格式允许动态调整大小和裁剪,因此您无需在服务器上存储不同的图像大小。通过高度优化的无cookie基础架构为图像提供低延迟。

以下是一个示例:https://lh6.ggpht.com/lOghqU2JrYk8M-Aoio8WjMM6mstgZcTP0VzJk79HteVLhnwZy0kqbgVGQZYP8YsoqVNzsu0EBysX16qMJe7H2BsOAr4j=s70

有关详细信息,请参阅此博文:http://googleappengine.blogspot.nl/2010/08/multi-tenancy-support-high-performance_17.html