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()
    
    ...
Вернуться на верх