2012-03-20 11 views
1

私は自分のモデルの内部化にdjango-transmetaを使用しています。それはとてもうまくいっています。それはこのようにデータベースにモデルを保存している:Djangoで多言語APIにtastypieを使用するには?

name_en, name_de, name_tr ... 

あなたがobject.nameを必要とするときに、それは私の仕事のために非常に良いですwhic、現在のロケールで名前を返します。

私は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() 

何かがそれが解決策になることができます言っていますか?

+0

はい、ModelResourceを使用できますが、たとえばname_enではなくnameなどのフィールドを明示的に定義することができます。次に、dehydrate_nameを使用するか、またはデータベースから適切な値を取得するために脱水します。 langキーワードは、形式がどこで決定されるかを考慮することができます。あなたはtastypie.resourcesのソースを見てみたいと思うかもしれませんが、それはうまくいくでしょう。がんばろう ! – kgr

答えて

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」によって処理されますので、私は同じ問題に直面してきましたが、私は別の方法でそれを解決してきました

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

それを手動でアクティブにする必要はありません。

関連する問題