Created
December 31, 2021 00:10
-
-
Save ishakoktn/3eebd748b0328b3d9568d6b73e613afe to your computer and use it in GitHub Desktop.
Django Parler Serializer To Take Only Selected Language's Data
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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