python - 使用 django rest 框架按名称返回信息

标签 python django django-rest-framework

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

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/ 这会返回所有项目,购买 如果现在我想要一个特定的项目,我是否需要创建一个新类? ?如果我想使用相同的 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=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)

可以在同一个类(class)做吗?我尝试使用 retrieve 方法但需要项目的 ID,没有名称对吗?

提前致谢!

最佳答案

您需要在 View 类中添加 lookup_field。假设,您想通过用户名获取用户,您需要添加 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)

现在您的网址将是

url(r'^users/$', UserViewSet.as_view({'get': 'list'})),
url(r'^users/(?P<username>[a-zA-Z0-9]+)$', UserViewSet.as_view({'get': 'retrieve'})),

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

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

关于python - 使用 django rest 框架按名称返回信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39729388/

相关文章:

django - 使用 django rest 框架在验证步骤之前修改数据

python - 如何在Windows/Linux上修改或提取多个文件/文件夹名称?

python - 使用颜色编码节点绘制邻接矩阵

javascript - 在 JavaScript 中传递变量

Django 忽略表单字段 required=True

python - 如何在 Django 中从 postgresql 迁移到 sqlite3?

python - Django休息框架: Duplicate key value violates unique constraint

python - 算法分析,哪一个是正确的?

python - Django 与 Heroku 上的 PostgreSQL 应用程序不同步

python - 如何将 django 的 TemporaryUploadedFile 视为常规 python 文件