【问题标题】:django translation get_language returns default language in detail api viewdjango翻译get_language详细api视图返回默认语言
【发布时间】:2021-10-26 14:10:38
【问题描述】:

这是当用户选择某种语言时设置语言的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()

可能的问题是什么?

【问题讨论】:

    标签: django django-rest-framework translation


    【解决方案1】:

    您的视图集定义为:

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

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

    【讨论】:

    • 很好的答案。谢谢
    猜你喜欢
    • 2014-12-26
    • 2015-03-29
    • 2020-03-25
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2022-01-22
    • 2010-12-18
    相关资源
    最近更新 更多