如何在Django中使用tastypie进行多语言API?

时间:2012-03-20 21:49:29

标签: django tastypie

我正在使用django-transmeta来模仿我的模型。它工作得很好。它将模型保存到数据库中,如下所示:

name_en, name_de, name_tr ...

所以当你需要object.name时,它会返回当前语言环境中的名称,这对我的任务非常有用。

我正在为RESTful API使用tastypie。 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() 

喜欢的东西可以解决方案吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'处理,因此无需手动激活。