1

モデルの内部化に 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 ではなく) を英語で応答する必要があります。

どうやってやるの?これを処理できるタスティパイ機能、カスタマイズは何ですか?

アップデート:

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

解決策になることが好きなものはありますか?

4

2 に答える 2

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」によって処理されるため、手動で有効にする必要はありません。

于 2015-02-25T10:46:40.040 に答える
0

以下のモデルは私の問題を解決しました。ありがとうございます!

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
于 2012-03-21T21:44:45.507 に答える