2012-03-20 26 views
1

我正在使用django-transmeta進行模型的內化。它工作得很好。據模型保存到數據庫中是這樣的:如何在Django中使用tastypie進行多語言API?

name_en, name_de, name_tr ... 

所以當你需要object.name,它返回在當前區域的名稱,whic是我的任務很不錯。

我正在使用tastypie作爲RESTful API。 Tastypie返回表的所有列(name_en,name_de,name_tr)。我要的是,在發出請求,如:

http://127.0.0.1:8000/api/object/?format=json&lang=en

所以服務器應該響應只有英文名稱(不name_en,name_de,name_tr)。

我該怎麼做?什麼tastypie功能,定製可以處理這個?

更新:

def dehydrate_title(self, bundle): 
     return bundle.data['title'].upper() 

喜歡的東西,可以是一個解決辦法?

+0

是的,你可以使用ModelResource,但明確定義字段,例如name,而不是name_en。然後使用dehydrate_name或者脫水以從數據庫檢索適當的值。 lang關鍵字可以用來確定格式的確定位置。你可能想看看tastypie.resources的來源,但它會起作用。祝你好運 ! – kgr 2012-03-21 11:56:03

回答

0

下面的模型解決了我的問題。謝謝kgr!

from tastypie.resources import ModelResource 
from padmenu.item.models import Item 
from django.utils.translation import activate 
from tastypie import fields 


class ItemResource(ModelResource): 
    name = fields.CharField() 
    description = fields.CharField() 
    class Meta: 
     queryset = Item.objects.all() 
     resource_name = 'item' 
     excludes = ['name_tr', 'name_de', 'name_en', 'description_tr', 'description_de', 'description_en'] 

def dehydrate(self, bundle): 
    lang = str(bundle.request.GET.get('lang')) 
    activate(lang) 
    bundle.data['name'] = bundle.obj.name 
    bundle.data['description'] = bundle.obj.description 
    return bundle 
0

我面臨着同樣的問題,但我以另一種方式解決了這個問題:

######## settings.py ######### 

gettext = lambda s: s 
LANGUAGES = (
    ('uk', gettext('Ukrainian')), 
    ('ru', gettext('Russian')), 
    ('en', gettext('English')), 
) 

######## api.py ######### 
exclude_fields = set('_' + lang[0] for lang in settings.LANGUAGES) 

class MyModelResource(ModelResource): 
    class Meta: 
     cls = MyModel 
     queryset = cls.objects.all() 
     resource_name = 'mymodel' 
     excludes = [field for field in cls._meta.get_all_field_names() if field[-3:] in exclude_fields] 

當前語言是由「django.middleware.locale.LocaleMiddleware」處理,所以沒有必要手動激活它。

相關問題