如何在Django中实现以数据库建筑名称为路径参数的动态URL评论API
实现步骤
1. 调整urls.py配置动态路径参数
在路径中用<参数类型:参数名>的格式声明动态参数,会自动将路径中对应位置的内容作为参数传递给视图函数:
from django.contrib import admin from django.urls import path from crawling_data.views import ReviewListAPI from crawling_data.views import BuildingInfoAPI urlpatterns = [ path('admin/', admin.site.urls), path('api/buildingdata/', BuildingInfoAPI.as_view()), # 新增带建筑名称参数的路由 path('api/buildingdata/<str:building_name>/', ReviewListAPI.as_view()) ]
2. 修改ReviewListAPI视图接收参数并过滤数据
首先注意类视图的方法第一个参数必须是self,原来的代码漏写了会报错,其次要接收路由传递的building_name参数,用这个参数过滤评论查询集:
class ReviewListAPI(APIView): # 增加self参数和building_name路径参数 def get(self, request, building_name): # 按路径传入的建筑名称过滤评论数据 queryset = reviewData.objects.filter(building_name=building_name) serializer = ReviewSerializer(queryset, many=True) return Response(serializer.data)
如果需要对不存在的建筑返回404提示,可以补充校验逻辑:
from rest_framework import status from rest_framework.response import Response class ReviewListAPI(APIView): def get(self, request, building_name): # 先校验建筑是否存在 if not buildingData.objects.filter(building_name=building_name).exists(): return Response({"error": "该建筑不存在"}, status=status.HTTP_404_NOT_FOUND) queryset = reviewData.objects.filter(building_name=building_name) serializer = ReviewSerializer(queryset, many=True) return Response(serializer.data)
3. 修复原有代码的隐藏问题
你现有代码中BuildingInfoAPI的get方法也漏写了self参数,需要同步修改,否则接口请求会报错:
class BuildingInfoAPI(APIView): # 补全self参数 def get(self, request): queryset = buildingData.objects.all() # 注意:这里你之前用了ReviewSerializer序列化建筑数据是错误的,需要单独写对应buildingData模型的序列化器 # 正确示例假设你写了BuildingSerializer: # serializer = BuildingSerializer(queryset, many=True) serializer = ReviewSerializer(queryset, many=True) return Response(serializer.data)
内容的提问来源于stack exchange,提问作者JYH
相关产品推荐
相关产品推荐

