将类别输入Google App Engine的不同方式

时间:2012-04-02 16:57:56

标签: python google-app-engine gql

我正在寻找在App Engine中处理类别的最智能/多种方式。我看到两种方法:

Google App Engine Data Store Model Reference Another Class

使用方式A:

 companycategory = db.ReferenceProperty(mycategories, collection_name = 'categories')

来自网址中的示例:

class Category(db.Model)
    name = db.StringProperty(required=True)
    city = db.ReferenceProperty(City, collection_name = 'categories')

和方式B:

companycategory = db.CategoryProperty(default="A", choices=["A", "AA", "B", "C"], required=True)

还有什么需要考虑的。 A使用一个表和另一个看似矫枉过正的对象模型,但是方式B将文本放入字段中,这意味着拼写错误很可能会陷入困境。没有将整数放入类别字段并手动引用是否有一种聪明的方法可以做其他事情?或者我用另一个型号/桌子咬住子弹?

提前致谢

1 个答案:

答案 0 :(得分:2)

您可以查看taggable-mixin以获取其他选项。

在AppEngine中处理类别的“最聪明”方式因用例而异。

您是否有预定义的类别列表,或者您是否允许用户动态添加自己的类别?最佳答案可能因您的具体情况而异。

在大多数使用AppEngine的情况下,您通常会想要使用“去规范化”选项。它可以节省数据存储区写入和读取的费用。而且因为它的写入和读取次数较少,所以它也更快。

您也可以使用db.StringListProperty()代替db.CategoryProperty()来允许公司在多个类别下归档。

如果您提前知道可能的类别,我会做类似的事情:

class Company(db.Model):
    name = db.StringProperty()
    category = db.StringListProperty() #to allow multiple categories

#Creating a company
company = Company()
company.name = "XYZ Car Rental Corporation"
company.category = ["NEW YORK","CAR RENTAL", "CORPORATION"] #City and Company Category. I would make them all uppercase to prevent case-sensitive/typo issues.
company.put()

#querying
query = Company.all()
query.filter('category',"NEW YORK")
results = query.fetch(10)  #this returns Company entities with "NEW YORK" in their category list

#You can also do multiple categories (AND)
query = Company.all()
query.filter('category',"NEW YORK")
query.filter('category',"CORPORATION")
results = query.fetch(10)  #this returns Company entities with "NEW YORK" and "CORPORATION" in their category list

如果您的用户动态创建类别,并且某个类别下的实体数量相对较少(少于1000个),我建议taggable-mixin