2012-04-02 57 views
0

我正在尋找處理App Engine中類別的最智能/多種方式。我看到兩種方法:將類別輸入到Google App Engine中的方式不同

Google App Engine Data Store Model Reference Another Class

使用方法答:

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將文本放入字段中,這意味着錯字可能會很好地蔓延。將整數放入類別字段並手動引用是否有一種聰明的方法來執行其他任何操作?或者我用另一個模型/桌子咬子彈?

在此先感謝

回答

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

+0

@Dave:如果您剛剛開始新鮮,則可能需要考慮使用較新的NDB模塊來代替數據庫:https://developers.google.com/appengine/docs/python/ndb/。此外,由於您擔心輸入錯誤等,您可以爲所有有效的類別創建一個單獨的存儲,並根據輸入檢查輸入,以確保存儲的內容是適當的。 – Sologoub 2012-04-03 04:12:25

+0

謝謝。我想我的一個複雜是Django框架。字符串的方式雖然不像按鍵那麼優雅,但對於這個用例來說很好。然而,我有Django模板的麻煩,我得到以下錯誤:'code'BadValueError:Property companycategory is ['B','i','o'];當我使用下面的代碼companycategory = db.StringListProperty(default =「Bio」,choices = [「Bio」,必須是['Bio','Pharm','I',''] 「Pharm」,「I」,「S」],required = True)'code' – Androidian 2012-04-03 09:39:36

+0

@Dave:將default =「Bio」更改爲default = [「Bio」]。 StringListProperty需要一個字符串列表(即使是一個字符串的列表),但不是一個字符串。 – Albert 2012-04-04 02:41:11