Django translation get_language возвращает язык по умолчанию в детальном представлении api
это api, который устанавливает язык, когда пользователь выбирает какой-то язык, это работает нормально.
class SetLanguage(APIView):
def get(self, request, *args, **kwargs):
user_language = kwargs.get("lan_code")
translation.activate(user_language)
response = Response(status=status.HTTP_200_OK)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)
request.session[LANGUAGE_SESSION_KEY] = user_language
return response
viewset
Здесь с этим набором представлений только в api blog/{id}
функция get_language
возвращает код языка по умолчанию, но на других api она работает правильно. Я не могу найти проблему.
Что может пойти не так?
class BlogViewSet(ModelViewSet):
queryset = Blog.objects.all()
serializer_class = BlogSerilizer
detail_serializer_class = BlogDetailSerializer
def get_serializer_class(self):
if self.action == "retrieve":
return self.detail_serializer_class
return super().get_serializer_class()
def list(self, request, *args, **kwargs):
queryset = Blog.objects.filter(parent=None)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@action(detail=True, methods=["get"])
def childs(self, request, id):
child_blogs = Blog.objects.filter(parent_id=id)
serializer = self.get_serializer(child_blogs, many=True)
return Response(serializer.data)
модель
from django.utils.translation import get_language
class MyManager(models.Manager):
def get_queryset(self):
current_language = get_language()
print(current_language)
return super().get_queryset().filter(language=current_language)
class Blog(models.Model):
title = models.CharField(_("Title"), max_length=100)
objects = MyManager()
Какая может быть проблема?
Ваш набор представлений определен как:
class BlogViewSet(ModelViewSet):
queryset = Blog.l_objects.all()
...
Здесь следует обратить внимание на то, что ваш кверисет определяется на уровне модуля. Следовательно, вызываются ваши менеджеры get_queryset
. Учитывая, что пока не было запросов, get_language()
возвращает язык по умолчанию, который затем используется повсеместно, поскольку стандартная реализация метода get
просто вызовет viewset's. get_queryset
, который затем вызовет .all()
на указанном кверисете, следовательно, ваше ожидание того, что manager's get_queryset
будет вызываться каждый запрос, не происходит, и кверисет языка по умолчанию используется повторно везде.
Для решения этой проблемы можно просто написать метод get_queryset
для набора представлений, заставляя каждый раз создавать новый набор запросов:
class BlogViewSet(ModelViewSet):
queryset = Blog.l_objects.all()
serializer_class = BlogSerilizer
detail_serializer_class = BlogDetailSerializer
def get_queryset(self):
return Blog.l_objects.all()
...