You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:01