Skip to content

Instantly share code, notes, and snippets.

@joke2k
Created September 9, 2014 10:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save joke2k/f8ae2dd0c373c65949c6 to your computer and use it in GitHub Desktop.
Save joke2k/f8ae2dd0c373c65949c6 to your computer and use it in GitHub Desktop.
Django Rest Framework Translated
# https://groups.google.com/forum/#!topic/django-rest-framework/WTZ0H6dyJe4
class TranslateSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(TranslateSerializer, self).__init__(*args, **kwargs)
self.translate_fields = getattr(self.Meta, 'translate_fields', ())
if kwargs.get('context', None):
self.lang = utils.get_request_language(kwargs['context'].get('request', None))
def to_native(self, obj):
# Exclude ALWAYS language specific fields
for language in settings.LANGUAGES:
if language[0] != 'en':
for field in self.translate_fields:
key = field + '_' + language[0]
if self.fields.get(key):
self.fields.pop(key)
ret = super(serializers.ModelSerializer, self).to_native(obj)
# Get current language and give the fields
if self.lang != 'en':
for field in self.translate_fields:
trans = getattr(obj, field + "_" + self.lang)
if trans:
ret[field] = trans
return ret
def from_native(self, data, files):
instance = getattr(self, 'object', None)
if self.lang != 'en':
for field in self.translate_fields:
value = data.get(field) or None
if value:
data[field + "_" + self.lang] = value
# If is instance (existent object), set the original attr
data[field] = getattr(instance, field, data[field])
ret = super(serializers.ModelSerializer, self).from_native(data, files)
return ret
# That's it. So, let's say I have a model Tag with name and name_es attributes among others. I can use this now:
class ProductTagSerializer(TranslateSerializer):
class Meta:
model = ProductTag
translate_fields = ('name',)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment