Adr*_*ire 4 django django-rest-framework
根据Django REST 框架文档,以下两个代码片段的行为应该相同。
class UserViewSet(viewsets.ViewSet):
"""
A simple ViewSet for listing or retrieving users.
"""
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None):
queryset = User.objects.all()
user = get_object_or_404(queryset, pk=pk)
serializer = UserSerializer(user)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
class UserViewSet(viewsets.ModelViewSet):
"""
A viewset for viewing and editing user instances.
"""
serializer_class = UserSerializer
queryset = User.objects.all()
Run Code Online (Sandbox Code Playgroud)
但按照我的解释方式,在第一种情况下,查询User.objects.all()会在每次 api 调用时运行,在第二种情况下,查询仅在 Web 服务器启动时运行一次,因为它是类变量。我错了吗 ?至少在我的测试中,尝试模拟 User.objects.all 将会失败,因为那时 UserViewSet.queryset 已经是一个空的 Queryset 对象。
有人请解释一下为什么不应该像 pest 一样避免使用 queryset 类参数,而是使用 get_queryset ?编辑:用 get_queryset 替换 queryset 会使 self.queryset 在检索方法中未定义,所以我还需要在方法中使用 self.get_queryset() ...
来自 Django文档:
\n\n\n\n\n查询集是惰性的\xe2\x80\x93,创建查询集的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,并且 Django 不会\xe2\x80\x99 实际运行查询,直到对 QuerySet 进行评估
\n
ModelViewSet提供其他操作,例如delete您update可能需要为用户模型添加一些限制(例如检查权限或者您可能不希望让用户简单地删除他们的个人资料)
self.queryset用于路由器和基本名称等,您可以忽略它并在路由器中手动设置基本名称。这不是强制的,但我认为它使我的代码更具可读性
请注意,通常def get_queryset在您想要对默认查询集执行某些操作时使用,例如self.queryset基于当前用户的限制。所以如果get_queryset要返回.objects.all()或者.objects.filter(active=True)我建议使用self.queryset更清晰的代码
注意2:如果您决定定义,get_queryset我建议也定义self.queryset(如果可能)
注意3:始终self.get_queryset在您的视图方法中使用,即使您没有定义此方法,您可能需要稍后创建该方法,如果您的视图方法正在使用self.queryset它可能会导致代码中出现一些问题
| 归档时间: |
|
| 查看次数: |
5966 次 |
| 最近记录: |