【问题标题】:Writing NDB Property Subclass编写 NDB 属性子类
【发布时间】:2012-09-16 23:41:36
【问题描述】:

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

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

然后:

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

然后图像将保存到调整大小为给定高度、宽度值的数据库中。 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) 这样的定义。

【问题讨论】:

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


    【解决方案1】:

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

    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 进行不必要的额外调整大小调用;自动属性转换非常强大,但有时可能会进行冗余调用。

    祝你好运!

    【讨论】:

    • 这是我最终的做法,比我想到的前两种方式简单得多(被文档弄糊涂了)。我使用图像 api 在 _to_base_type() 中调整大小并返回要保存的产品。
    【解决方案2】:

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

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

    这里是一个例子:https://lh6.ggpht.com/lOghqU2JrYk8M-Aoio8WjMM6mstgZcTP0VzJk79HteVLhnwZy0kqbgVGQZYP8YsoqVNzsu0EBysX16qMJe7H2BsOAr4j=s70

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

    【讨论】:

    • 据我了解,get_serving_url 在将图像保存到数据存储后检索图像。这是我所要求的另一种方法,在服务时保存高度和宽度并调整大小。
    • 图像保存在 blobstore 中。您的密钥是 blobkey。使用此 blobkey,您可以获得 get_serving_url。当您将此 get_serving_url 链接保存在数据存储中时,您可以包含大小。看我的例子'..s70'意味着size=70。以这种方式提供这些图像有很多优势。清除?顺便一提。您只需要一种尺寸,因为将保持长宽比。请参阅文档。
    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多