using django rest framework to return info by name
<p>I am using Django rest framework  and I create this class to return all the name of project</p>

<pre><code>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)
</code></pre>

<p>my URL is like that  <code>http://127.0.0.1:8000/cpuProjects/</code>  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
<code>http://127.0.0.1:8000/cpuProjects/</code> => return all project
<code>http://127.0.0.1:8000/cpuProjects/nameProject</code> => return a particular project.</p>

<pre><code>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)
</code></pre>

<p>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?   </p>

<p>thanks in advance!</p>

<p>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:</p>

<pre><code>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)
</code></pre>

<p>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</p>

<pre><code>class cpuProjectsViewset(viewsets.ModelViewSet):
    serializer_class =serializer = serializers.cpuProjectsSerializer
    queryset = CpuProject.objects.all()
</code></pre>

<p>You don't need a retrieve method here!!</p>

<p>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</p>

<pre><code>from rest_framework.decorators import detail_route, list_route
@detail_route(url_path='(?P&lt;slug&gt;[\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)
</code></pre>

python django django-rest-framework