1

我想實現一個與i18n一起工作的類別結構。由於GAE具有內建的db.CategoryProperty,但它沒有實現子類別,並且似乎使用category屬性,因爲它是我的模型的列表對象。如何實現類別系統

class Vehicles(GeoModel,search.SearchableModel): 
    title=db.StringProperty(verbose_name="title")#required 
    category=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Category") 
... 

並非所有車輛都有手動或自動型變速箱,但汽車當然可以。所以,我可以添加另一個實例變量,gearbox = ...但因爲這會對大多數情況下沒有意義,我應該避免的實施,並與繼承做到這一點,而不是:

class Cars(Vehicles): 
    gearbox=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Gearbox" 
    mileage=db.CategoryProperty(choices('0','1','2','3','4','5',default='1',verbose_name="Mileage" 
    fuel=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Fuel" 

是與繼承最好在剛添加子類別的解決方案實例變量作爲基類中的實例變量?如果我使用繼承,將重新分類對象仍然工作嗎?我怎樣才能實現這些選擇,以便使用i18n迭代類別?我的模板目前看起來像:

{% load i18n %} 
<select name="cg" id="cat" class="category"> 
<option value='' style='background-color:#dcdcc3' id='cat1' >-- {% trans "VEHICLES" %} --</option> 
<option value='2' {% ifequal "2" cg %} selected="selected" {% endifequal %} id='cat2' >{% trans "Cars" %}</option> 
... 

django是否有更方便的解決方案呢? app engine/django還有哪些類可以實現工作實現?我應該做我的選擇是這樣,而不是:

choices = [ (1, _('Vehicles')), (2, _('Cars')), (3, _('Bicycles')), (4, _('Motorcycles')) ] 
category=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Category") 
+1

我沒有使用Django一段時間所以不會回答,但你可能想看看[Expando](http://code.google.com/ appengine/docs/python/datastore/expandoclass.html)或[PolyModel](http://code.google.com/appengine/docs/python/datastore/polymodelclass.html)類。 –

回答

2

CategoryProperty只是一個StringProperty與語義的名字:當它序列化爲XML它使用不同的標籤名。沒有別的不同,真的。

你最後的代碼段應該可以工作,但爲什麼要依賴整數索引?如果您有一天更改訂單,可能會有問題。你可以使用字典代替:

choices = { 
    'vehicles': _('Vehicles'), 
    'cars': _('Cars'), 
    'bicycles': _('Bicycles'), 
    'motorcycles': _('Motorcycles') 
} 
category = db.CategoryProperty(choices=choices.keys(), default='cars', 
           verbose_name="Category") 
+0

謝謝莫拉斯。爲什麼依賴整數索引?那麼'cg = 4'是網址查詢應該選擇一個類別的方式。有一個數據模型與我自己的整數索引似乎是錯誤的,現在我明白我怎麼可以用i18n做到這一點,並避免有一個數據模型依賴於我自己的整數集。 –