這是當用戶選擇某種語言時設定語言的 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
視圖集
在這里,這個視圖集僅在 apiblog/{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()
可能的問題是什么?
uj5u.com熱心網友回復:
您的視圖集定義為:
class BlogViewSet(ModelViewSet):
queryset = Blog.l_objects.all()
...
這里要注意的一點是您的查詢集是在模塊級別定義的。因此,您的經理get_queryset被稱為。考慮到還沒有請求get_language()回傳默認語言,然后在任何地方重用,因為該get方法的默認實作只會呼叫視圖集 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()
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/337559.html
