2011-03-04 29 views
2

我见过多次的例子是这样的:定义属性在Python对象/实体/谷歌应用程序引擎

from google.appengine.ext import db 
import datetime 

class Book(db.Expando): 
    pass 

obj = Book() 
obj.title = 'The Grapes of Wrath' 
obj.author = 'John Steinbeck' 
obj.copyright_year = 1939 
obj.author_birthdate = datetime.date(1902, 2, 27) 

obj.put() 

这是我第一次遇到这种代码,在属性设置外部的类定义。这让我觉得很糟糕。我更喜欢:

class Book(db.Model): 
    title = db.StringProperty() 
    author = db.StringProperty() 
    copyright_year = db.IntegerProperty() 
    author_birthdate = db.DateProperty() 

... 
    obj = Book(title='The Grapes of Wrath', author='John Steinbeck', copyright_year=1939, author_birthdate=datetime.date(1902, 2, 27)) 

有人可以提供对作者的实践的性质的保证?何时何地可以接受这种方法?

有人提到,谷歌的数据存储模型允许不寻常的灵活性。我认为这个例子可能是对这个概念的一个可怜和过于微妙的介绍。作者实际上已经指出了这种风格的缺点,然后继续重复它。所以,它可能会有一些优势。

+0

只是好奇 - 哪本书? – 2011-03-04 19:22:39

+0

编程Google App Engine,Dan Sanderson,O'Reilly/Google Press。这是非常分散的,任何人都知道更好的书籍学习谷歌应用程序引擎? – shafty 2011-03-04 19:27:34

回答

3

这记录在here。所提供的代码段是有效的,尽管目前还不清楚类为什么完全是空的(可能出于说明的目的)。我想主要的问题是何时使用Expando Model

想象一下,一个网站可以收集各种商品的订单。一位顾客可能想订购一只小猫,另一位顾客可能想订购一本书等。书籍和小猫的共同点很少,可能只是价格和重量。但我们希望我们的客户提供他们的管理者的详细信息,例如一个顾客可能会订购一只3个月大的小猫,暹罗猫,蓝眼睛,另一个可能会订购“指环王”第二版,精装书,作者签名等。虽然这些属性在收集订单时不相关,它们对您的业务逻辑至关重要。您也可以稍后处理这些属性。

这里唯一的解决方案是使用Expando模型,因为您无法创建覆盖所有现有属性的通用类(或层次结构)。 Expando模型将包含所有常规属性(价格,重量,跟踪编号,运费,自定义费用等)和方法(计算总额,折扣等),其余属性将由客户动态创建在运行时。模型实例将以其所有属性保存到数据存储中,并且任何特定实例都将通过Model.properties()方法返回在其上定义的所有属性。

+0

这是一个非常明确和简短的解释,如果只有作者困扰这样做。 – shafty 2011-03-05 18:44:29

+0

很好的解释,但我认为不是一个很好的理由:如果这些属性对于业务逻辑来说是必不可少的,那么它们应该被包含在模型定义中。 – 2011-03-08 02:11:38

+0

没有必要。这些属性对满足客户的要求至关重要(例如客户拿到红色咖啡杯,而不是蓝色),但他们对处理逻辑没有什么价值。 你认为这会是对Expando的滥用吗?鉴于我不事先知道某一特定实例的属性数量及其类型,什么会是更好的方法? – eGlyph 2011-03-08 19:45:02

2

这很有趣。我读了同一本书,并认为同样的事情。自从它启动以来,我一直在使用App Engine Python,从不使用Expando模型。

我认为作者的意图是让那些可能不熟悉Python类的读者理解为定义模型的概念,但我没有发现它有帮助。

有一次,数据存储的灵活性对我来说非常方便,当时我将其中一个模型中的字段从使用DateTime切换到使用自定义String属性。有两种类型的字段的实体可以并排居住,我可以在每个字段都被访问时迁移它们。

+0

+1。我也从未使用Expando。这是一个很酷的想法,我很高兴它在那里,但我很难用它来尝试教某个人关于GAE数据存储编程。 – 2011-03-04 20:48:57

+0

可以推荐学习使用App Engine Python的更好源代码吗? – shafty 2011-03-05 18:43:22

+1

@shafty这是我得到的唯一一本书。它有助于理解索引如何工作,以及查询的限制是什么。之后,我主要研究了Google的示例应用程序及其参考文档(包含精彩的代码片段)。根据您的Python体验,您可能想要学习Python第3版。它很好地涵盖了Python 2.5(可以买便宜的)。 – Calvin 2011-03-05 21:02:05