Stone Stone - 1 month ago 15
Python Question

using django rest framework to return info by name

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 = 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(

my URL is like that
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
=> return all project
=> return a particular project.

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

def retrieve(self, request, project_name=None):
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(

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(

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
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(