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()
...
这是 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()
...