django 翻译 get_language returns 默认语言详细 api 查看

django translation get_language returns default language in detail api view

这是 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

视图集

此处仅在 api blog/{id} 函数 get_language 中使用此视图集返回默认语言代码,但在其他 api 中它工作正常。我找不到问题所在。 可能出了什么问题?

class BlogViewSet(ModelViewSet):
    queryset = Blog.l_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.l_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.l_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 = models.Manager()
    l_objects = MyManager()

可能是什么问题?

您的视图集定义为:

class BlogViewSet(ModelViewSet):
    queryset = Blog.l_objects.all()
    ...

这里要注意的一点是,您的查询集是在模块级别定义的。因此,您的经理 get_queryset 被调用。考虑到还没有请求 get_language() returns 默认语言,然后在所有地方重复使用,因为 get 方法的默认实现将只调用 viewset 的 get_queryset 然后将在指定的查询集上调用 .all() 因此您对 经理的 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()
    
    ...