2017-11-20 4 views
0

シリアル化中に、私のCategorySerializerの変数 "name"と "description"を翻訳したいと思います。Django Restフレームワークのシリアライズ

from rest_framework import serializers 
from api.models import Category 
from django.utils.translation import ugettext_lazy as _ 

class CategorySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Category 
     fields = ('id', 'name', 'image', 'description') 

シリアライザメソッドのフィールドは良いですか?

PD:この名前はdjango.poで翻訳されています。

答えて

2

はい、単純にSerializerMethodFieldを定義し、その場で変換を返します。

class CategorySerializer(serializers.ModelSerializer): 

    translation = SerializerMethodField('get_description_string') 

    class Meta: 
     model = Category 
     fields = ('id','translation',) 

    def get_description_string(self,obj): 
     return obj.description 
3

serializers.py

from rest_framework import serializers 
from api.models import Category 
from django.utils.translation import ugettext_lazy as _ 

class CategorySerializer(serializers.ModelSerializer): 
    name_ = serializers.ReadOnlyField(source='get_name') 
    description_ = serializers.ReadOnlyField(source='get_ description') 

    class Meta: 
     model = Category 
     fields = ('id', 'name', 'image', 'description') 

    def get_name(self): 
     return _(self.name) 

    def get_description(self): 
     return _(self.name) 

あなたがしたい場合は、 『名前』と「説明として、フィールドの名前を変更することができます。次の例では、「翻訳」にフィールド「説明」を変更します"その後;

def to_representation(self, instance): 
    """ 
    Object instance -> Dict of primitive datatypes. 
    """ 
    ret = OrderedDict() 
    fields = self._readable_fields 


    for field in fields: 
     try: 
      attribute = field.get_attribute(instance) 
     except SkipField: 
      continue 

     # We skip `to_representation` for `None` values so that fields do 
     # not have to explicitly deal with that case. 
     # 
     # For related fields with `use_pk_only_optimization` we need to 
     # resolve the pk value. 
     check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute 
     if check_for_none is None: 
      ret[field.field_name] = None 
     else: 

      # override to_representation function 
      if field.field_name == "name" or field.field_name == "description": 
       ret[field.field_name] = _(attribute) 


    return ret 
関連する問題