Django中如何按登录用户与房间ID过滤ChartData类的图表数据
解决方案
步骤1:修复认证与权限配置
你的ChartData类禁用了认证机制,导致无法获取当前登录用户信息。需要恢复默认认证/权限类,确保能正常拿到request.user:
from rest_framework.authentication import SessionAuthentication from rest_framework.permissions import IsAuthenticated class ChartData(APIView): # 移除不必要的models.Model继承(APIView无需继承数据库模型) authentication_classes = [SessionAuthentication] permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): # 后续逻辑修改见步骤2
步骤2:接收room_id参数并过滤数据
先在URL配置中为ChartData添加room_id参数,再在get方法中通过kwargs获取该参数,结合当前用户过滤目标数据:
def get(self, request, *args, **kwargs): # 从URL参数中提取room_id room_id = kwargs.get('room_id') if not room_id: return Response({"error": "room_id参数必填"}, status=400) # 过滤当前用户对应房间的温度数据,按时间排序保证图表顺序正确 filtered_posts = Post.objects.filter( username=request.user.username, room_id=room_id ).order_by('timestamp') # 一次性提取时间戳和温度数据,优化性能 labels = [] chartdata = [] for post in filtered_posts: labels.append(post.timestamp) chartdata.append(post.temperature) data = { "labels": labels, "chartLabel": f"房间{room_id}温度数据", "chartdata": chartdata } return Response(data)
步骤3:配置URL路由
在项目的urls.py中,为ChartData添加带room_id参数的API路由:
from django.urls import path from .views import ChartData, roomview urlpatterns = [ # 房间详情页路由 path('room/<int:room_id>/', roomview, name='roomview'), # 图表数据API路由 path('api/chart/<int:room_id>/', ChartData.as_view(), name='chart_data'), ]
步骤4:前端模板中调用API
在roomview.html里,利用页面上下文的room_id拼接API地址,请求对应数据渲染图表:
<!-- 示例:用Chart.js渲染折线图 --> <canvas id="temperatureChart"></canvas> <script> // 从模板变量获取当前房间ID const roomId = {{ room_id }}; fetch(`/api/chart/${roomId}/`) .then(response => response.json()) .then(data => { const ctx = document.getElementById('temperatureChart').getContext('2d'); new Chart(ctx, { type: 'line', data: { labels: data.labels, datasets: [{ label: data.chartLabel, data: data.chartdata, borderColor: 'rgb(75, 192, 192)', tension: 0.1 }] } }); }); </script>
关键说明
- 移除
models.Model继承:APIView是视图类,无需继承数据库模型,属于冗余写法。 - 按时间排序:确保图表上的时间戳按先后顺序展示,避免数据逻辑混乱。
- 参数校验:增加room_id非空判断,返回明确的错误提示,提升接口健壮性。
内容的提问来源于stack exchange,提问作者Maxwh
相关产品推荐
相关产品推荐

