使用Django-rest框架按nam返回信息

2024-05-10 09:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Django rest框架,我创建这个类来返回project的所有名称

class cpuProjectsViewSet(viewsets.ViewSet):
  serializer_class = serializers.cpuProjectsSerializer

  def list(self, request):
    all_rows = connect_database()
    name_project = [] 
    all_projects = []
    for item_row in all_rows:
      name_project.append(item_row['project'])
      name_project = list(sorted(set(name_project)))
    for i in range(0, len(name_project)):
      all_projects.append({'project' : str(name_project[i])})

    serializer = serializers.cpuProjectsSerializer(instance=all_projects, many=True)
    return Response(serializer.data)

我的URL是这样的http://127.0.0.1:8000/cpuProjects/这个返回所有的项目,如果现在我想要一个特定的项目,我是否要创建一个新的类??如果我想使用相同的网址。。。例如 http://127.0.0.1:8000/cpuProjects/=>;返回所有项目 http://127.0.0.1:8000/cpuProjects/nameProject=>;返回特定项目。在

^{pr2}$

有可能在同一个班上做吗?我尝试使用检索方法,但需要一个项目的ID,没有名称对吗?在

提前谢谢!在


Tags: 项目nameproject名称httpforalllist
3条回答

您需要在视图类中添加lookup_字段。假设,您想通过需要添加lookup_field = 'username'的用户名来获取用户。在

示例:

from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404
from myapps.serializers import UserSerializer
from rest_framework import viewsets
from rest_framework.response import Response

class UserViewSet(viewsets.ViewSet):

    lookup_field = 'username'

    def list(self, request):
        queryset = User.objects.all()
        serializer = UserSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, username=None):
        queryset = User.objects.all()
        user = get_object_or_404(queryset, username=username)
        serializer = UserSerializer(user)
        return Response(serializer.data)

现在你的网址将是

^{pr2}$

现在,http://127.0.0.1:8000/users/将返回所有用户,http://127.0.0.1:8000/users/username将返回特定的用户详细信息。在

您可以从Django REST framework了解有关lookup_field的更多信息。在

如果要使用同一个类,可以使用viewset并定义list()和retrieve()方法

检查http://www.django-rest-framework.org/api-guide/viewsets/第一个例子就是这样做的

from django.contrib.auth.models import User
from django.shortcuts import get_object_or_404
from myapps.serializers import UserSerializer
from rest_framework import viewsets
from rest_framework.response import Response

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)

除非绝对需要,否则不使用原始查询,即使如此,也不需要手动连接到数据库,因为您可以轻松访问连接对象。总体而言,您的检索方法可以改进如下:

def retrieve(self, request, pk=None):
    queryset = CpuProject.objects.all()
    cpu = get_object_or_404(queryset, pk=pk)
    serializer = serializers.cpuProjectsSerializer(cpu)
    return Response(serializer.data)

短得多,更容易阅读。但是如果使用ModelViewset,即使这样也不需要!然后默认的检索方法将为您处理这些问题。所以你的视图集减少到

^{pr2}$

这里不需要检索方法!!在

但我看到您试图通过名称检索特定的CpuProject项(而不是使用它的PK)。为此,您需要添加一条路线

from rest_framework.decorators import detail_route, list_route
@detail_route(url_path='(?P<slug>[\w-]+)')
def get_by_name(self, request, pk=None,slug=None):

    queryset = CpuProject.objects.all()
    cpu = get_object_or_404(queryset, name=slug)
    serializer = serializers.cpuProjectsSerializer(cpu)
    return Response(serializer.data)

相关问题 更多 >