使用django rest框架通过名称返回信息 [英] using django rest framework to return info by name

查看:202
本文介绍了使用django rest框架通过名称返回信息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Django休息框架,我创建这个类来返回项目的所有名称

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

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

serializer = serializers.cpuProjectsSerializer(instance = all_projects,许多= True)
返回响应(serializer.data)

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

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

def retrieve(self,request,project_name = $)
尝试:
opc = {'name_proj':project_name}
all_rows = connect_database(opc)
除了KeyError:
返回响应(status = status .HTTP_404_NOT_FOUND)
除了ValueError:
返回响应(status = status.HTTP_400_BAD_REQUEST)
serializer = serializers.cpuProjectsSerializer(instance = all_rows,many = True)
返回响应(serializer。数据)

是否可以在同一个类中执行?我尝试使用检索方法,但需要一个项目的ID,没有名称对吗?



提前谢谢

解决方案

除非绝对需要,即使如此,由于您可以轻松访问连接对象,因此无需手动连接到数据库。总体而言,您的检索方法可以改进如下:

  def retrieve(self,request,pk = None):
queryset = CpuProject.objects.all()
cpu = get_object_or_404(queryset,pk = pk)
serializer = serializers.cpuProjectsSerializer(cpu)
返回响应(serializer.data)

更短,更容易阅读。但即使这不是真的需要如果您使用ModelViewset!那么默认的检索方法将会为您处理。所以你的观点减少到

  class cpuProjectsViewset(viewsets.ModelViewSet):
serializer_class = serializer = serializers.cpuProjectsSerializer
queryset = CpuProject.objects.all()

这里不需要检索方法! !



但是我看到你试图通过它的名字来检索一个特定的CpuProject项目(而不是使用它的PK)。为此,您需要从rest_framework.decorators导入detail_route,$ _ $ b $ d
$ d $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ (?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)
返回响应(serializer.data)


I am using Django rest framework and I create this class to return all the name of 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)

my URL is like that http://127.0.0.1:8000/cpuProjects/ this return all the projects, buy If now I want a particular project, Have I to create a new class?? if I want to use the same URL ... for example http://127.0.0.1:8000/cpuProjects/ => return all project http://127.0.0.1:8000/cpuProjects/nameProject => return a particular project.

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

  def retrieve(self, request, project_name=None):
    try:
      opc = {'name_proj' : project_name }
      all_rows = connect_database(opc)
    except KeyError:
        return Response(status=status.HTTP_404_NOT_FOUND)
    except ValueError:
        return Response(status=status.HTTP_400_BAD_REQUEST)
    serializer = serializers.cpuProjectsSerializer(instance=all_rows, many=True)
    return Response(serializer.data)

Is it possible to do in the same class? I try to use retrieve method but the need an ID of the project, no the name right?

thanks in advance!

解决方案

One does not use raw queries unless absolutely needed and even then, there isn't a need to manually connect to the database because you have easy access to a connection object. Overall, your retrieve method can be improved as follows:

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)

Much shorter and easier to read. But Even this is not really needed If you use a ModelViewset! Then the default retrieve method will take care of this for you. So your viewset reduces to

class cpuProjectsViewset(viewsets.ModelViewSet):
    serializer_class =serializer = serializers.cpuProjectsSerializer
    queryset = CpuProject.objects.all()

You don't need a retrieve method here!!

But I see that you are trying to retrieve a particular CpuProject item by it's name (rather than using it's PK). For that you need to add a route

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)

这篇关于使用django rest框架通过名称返回信息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆