Skip to content

Instantly share code, notes, and snippets.

@ishakoktn
Created December 31, 2021 00:10
Show Gist options
  • Save ishakoktn/3eebd748b0328b3d9568d6b73e613afe to your computer and use it in GitHub Desktop.
Save ishakoktn/3eebd748b0328b3d9568d6b73e613afe to your computer and use it in GitHub Desktop.
Django Parler Serializer To Take Only Selected Language's Data
from django.conf import settings
LANGUAGES_CODES = [code for code, _ in settings.LANGUAGES]
DEFAULT_LANG = settings.PARLER_LANGUAGES['default'].get('fallback')
def get_languange_code(request):
""" gives languange code of the request
Returns(2 characters str)
e.g: 'fr'
"""
lang_code = request.META.get('HTTP_ACCEPT_LANGUAGE', None)
if lang_code and '-' in lang_code:
lang_code = lang_code.split('-')[0]
if lang_code not in LANGUAGES_CODES:
lang_code = 'en-us'
return lang_code
# https://github.com/django-parler/django-parler-rest/issues/26#issuecomment-666798305
# Main structure gets from the above link, made some changes due to getting different output structure.
class TranslatedSerializerMixin:
"""
Get values without "translations" key.
For selecting language; add "Accept-Language" into request header.
There is no dependence to django-parler-rest library.
Usage:
class MyModel(models.Model):
image = ...
translations = TranslatedFields(
name = models.CharField(...),
description = models.TextField(...)
)
class MySerializer(TranslatedSerializerMixin, serializers.ModelSerializer):
class Meta:
model = MyModel
fields = (
'id',
'image',
'name',
'description',
)
result:
[
{
id: 1,
image: '/images/001.png,
name: '<value for the selected language>'
description: '<value for the selected language>'
},
...
]
"""
def to_representation(self, instance):
request = self.context.get('request')
lang_code = get_languange_code(request)
ret = OrderedDict()
fields = self._readable_fields
instance.set_current_language(lang_code)
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:
ret[field.field_name] = field.to_representation(attribute)
return ret
class TranslatedModelSerializer(TranslatedSerializerMixin, ModelSerializer):
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment