使用django rest框架通过名称返回信息 [英] using django rest framework to return info by name
问题描述
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屋!