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

Django REST Framework:URL传用户ID实现关联任务CRUD接口求助

API开发问题修复与实现方案

一、GET方法错误修复

现有代码存在3个核心问题,修正后即可正常获取用户关联的TestingTasks:

  • 变量未定义:get方法参数为company_id,但代码中误用了未定义的id;同时参数命名不符合业务逻辑,建议改为user_id
  • 多实例序列化缺失:查询返回多个对象时,序列化器必须指定many=True
  • 模型反向关联命名不合理:related_name='users'会与User模型自身查询混淆,建议改为testing_tasks

修正后代码

model.py

class TestingTasks(models.Model): 
    Taskname = models.CharField(max_length=100, unique=True)    
    dateofuse = models.DateTimeField(auto_now_add=True)    
    Compressing = models.TextField()    
    Path = models.FileField(null=True)    
    # 字段名改为user更清晰,同时修正related_name
    user = models.ForeignKey(User, related_name='testing_tasks', on_delete=models.CASCADE, default=1)

views.py(GET部分)

class TestingAPI(APIView):
    permission_classes = [AllowAny]

    def get(self, request, user_id):
        # 过滤指定用户的所有任务
        instances = TestingTasks.objects.filter(user_id=user_id)
        # 多实例序列化必须加many=True
        serializer = TestingSerializer(instances, many=True)
        return Response(serializer.data)

urls.py

# 参数名改为user_id,贴合业务逻辑
path("Testing/<int:user_id>", views.TestingAPI.as_view())

二、PUT方法实现(更新单个任务)

RESTful风格下,需在URL中传入用户ID和任务ID,确保只能更新当前用户的任务:

def put(self, request, user_id, task_id):
    try:
        # 验证任务属于当前用户,防止越权
        task = TestingTasks.objects.get(id=task_id, user_id=user_id)
    except TestingTasks.DoesNotExist:
        return Response({"error": "任务不存在或不属于该用户"}, status=404)
    
    serializer = TestingSerializer(task, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=400)

对应URL需调整为:

path("Testing/<int:user_id>/<int:task_id>", views.TestingAPI.as_view())

三、DELETE方法实现(删除单个任务)

逻辑与PUT一致,先验证任务归属再执行删除:

def delete(self, request, user_id, task_id):
    try:
        task = TestingTasks.objects.get(id=task_id, user_id=user_id)
    except TestingTasks.DoesNotExist:
        return Response({"error": "任务不存在或不属于该用户"}, status=404)
    
    task.delete()
    return Response({"message": "任务删除成功"}, status=204)

四、额外注意事项

  • 序列化器TestingSerializer需正确定义,示例:
from rest_framework import serializers
from .models import TestingTasks

class TestingSerializer(serializers.ModelSerializer):
    class Meta:
        model = TestingTasks
        fields = ['id', 'Taskname', 'dateofuse', 'Compressing', 'Path', 'user']
        # 禁止前端修改用户关联,设置为只读
        extra_kwargs = {'user': {'read_only': True}}
  • 权限优化:当前使用AllowAny风险较高,建议改为IsAuthenticated,并通过request.user替代URL传参的user_id,避免用户ID伪造
  • 文件字段处理:Path字段需配置Django媒体文件路径,确保文件上传下载正常运行

内容的提问来源于stack exchange,提问作者hayeong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:55:26