Как использовать tastypie для многоязычного API в Django? - PullRequest
1 голос
/ 21 марта 2012

Я использую django-transmeta для интернализации моих моделей. Это работает очень хорошо. Это сохраняет модели в базу данных так:

name_en, name_de, name_tr ...

поэтому, когда вам нужен object.name, он возвращает имя в текущей локали, что очень хорошо для моей задачи.

Я использую вкусный пирог для 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) на английском языке.

Как я могу это сделать? Какая функция вкусного пирога, настройки могут справиться с этим?

Обновление:

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

Что-то понравилось, что может быть решением?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2015

Я столкнулся с той же проблемой, но решил ее по-другому:

######## 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', поэтому нет необходимости активировать его вручную.

0 голосов
/ 22 марта 2012

Ниже модель решила мою проблему. Спасибо, кгр!

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
...