【问题标题】:How to use tastypie for multilingual API in Django?如何在 Django 中将美味派用于多语言 API?
【发布时间】:2012-04-05 10:27:11
【问题描述】:

我正在使用 django-transmeta 来内化我的模型。它工作得很好。它像这样将模型保存到数据库中:

name_en, name_de, name_tr ...

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

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

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

【问题讨论】:

  • 是的,您可以使用 ModelResource 但显式定义字段,例如 name 而不是 name_en。然后使用 dehydrate_name 或只是 dehydrate 从数据库中检索适当的值。可以在确定格式的位置处理 lang 关键字。您可能想查看tastepie.resources 的来源以获取想法,但它会起作用。祝你好运!

标签: django tastypie


【解决方案1】:

以下模型解决了我的问题。谢谢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

【讨论】:

    【解决方案2】:

    我也遇到过同样的问题,但我用另一种方式解决了:

    ######## 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' 处理,因此无需手动激活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2015-12-12
      • 2019-02-19
      • 2014-03-15
      相关资源
      最近更新 更多