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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:46:07