Django API如何按建筑唯一ID拆分对应评论数据
问题解决修改点
按优先级从高到低需要修改以下位置:
1. 模型层(models.py):补全关联关系
首先确认两个核心模型满足以下约束,缺失则补充:
- 建筑模型需配置唯一
slug字段,和建筑名称一一映射 - 评论模型需通过外键关联到建筑模型,确保每条评论都绑定对应建筑
示例代码:
from django.db import models class Building(models.Model): name = models.CharField(max_length=200, unique=True, verbose_name="建筑名称") slug = models.SlugField(max_length=200, unique=True, verbose_name="路径唯一标识") # 其他建筑字段按需补充 class Comment(models.Model): building = models.ForeignKey(Building, on_delete=models.CASCADE, related_name="comments", verbose_name="所属建筑") content = models.TextField(verbose_name="评论内容") # 其他评论字段按需补充
2. 爬虫入库逻辑:补全关联绑定
爬取到评论数据入库时,必须先根据当前爬取的建筑名称/ slug查询到对应Building实例,再将该实例赋值给评论的building字段后保存,禁止直接保存无关联的评论数据。
示例入库逻辑:
# 假设当前爬取的建筑名称为current_building_name,爬取到的单条评论内容为comment_content building_obj = Building.objects.get(name=current_building_name) Comment.objects.create( building=building_obj, content=comment_content )
3. 视图层:添加查询集过滤逻辑
你当前返回全量评论的核心原因是视图没有按路径传入的slug参数过滤评论,按你使用的视图类型对应修改:
如果你用的是函数式视图(FBV)
from django.shortcuts import get_object_or_404 from django.http import JsonResponse from .models import Building, Comment def building_comment_view(request, slug): # 先按slug匹配到对应建筑 target_building = get_object_or_404(Building, slug=slug) # 仅查询该建筑关联的所有评论 comment_list = target_building.comments.all() # 序列化评论后返回即可
如果你用的是Django REST Framework(DRF)视图
重写get_queryset方法动态过滤,不要直接写死全量查询集:
from rest_framework import generics from .models import Comment from .serializers import CommentSerializer class BuildingCommentView(generics.ListAPIView): serializer_class = CommentSerializer def get_queryset(self): # 从路径参数中取slug slug = self.kwargs.get("slug") # 仅返回对应建筑的评论 return Comment.objects.filter(building__slug=slug)
4. 路由配置(urls.py):确认参数传递正确
确认路由中配置的参数名和视图中读取的参数名完全一致,示例配置:
from django.urls import path from .views import BuildingCommentView # 替换为你自己的视图名 urlpatterns = [ path('api/buildingdata/<str:slug>/', BuildingCommentView.as_view(), name="building_comment_list"), ]
内容的提问来源于stack exchange,提问作者T1JYH
相关产品推荐
相关产品推荐

