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

在DRF中如何实现仅对当前登录用户创建的数据进行CRUD操作?

实现方案

前置前提

首先确保你的Client和Project模型中已经添加了关联登录用户的外键字段,示例模型定义参考:

from django.db import models
from django.contrib.auth.models import User

class Client(models.Model):
    # 原有字段保留
    creator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="创建人")
    # 其余字段省略

class Project(models.Model):
    # 原有字段保留
    client = models.ForeignKey(Client, on_delete=models.CASCADE, verbose_name="所属客户")
    creator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="创建人")
    # 其余字段省略

如果你的模型中关联用户的字段名不是creator,后续代码替换为你自己的字段名即可。


第一步:修改序列化器

将创建人字段设置为只读,避免前端传值篡改创建人信息:

class ClientSerializer(serializers.ModelSerializer):
   class Meta:
      model = Client
      fields = '__all__'
      # 新增只读字段配置
      read_only_fields = ['creator']

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
       model = Project
       fields = '__all__'
       # 新增只读字段配置
       read_only_fields = ['creator']

如果需要额外限制创建项目时只能选择自己名下的客户,可以在项目序列化器中增加校验逻辑:

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
       model = Project
       fields = '__all__'
       read_only_fields = ['creator']
    
    def validate_client(self, value):
        if value.creator != self.context['request'].user:
            raise serializers.ValidationError("仅可关联自己创建的客户")
        return value

第二步:修改视图类

重写查询集过滤逻辑,仅返回当前登录用户创建的数据,同时重写创建逻辑自动填充当前用户为创建人:

class ClientView(viewsets.ModelViewSet):
    serializer_class = ClientSerializer
    permission_classes = [IsAuthenticated]
    authentication_classes = (TokenAuthentication, )

    # 过滤仅返回当前用户创建的客户
    def get_queryset(self):
        return Client.objects.filter(creator=self.request.user)
    
    # 创建时自动填充创建人
    def perform_create(self, serializer):
        serializer.save(creator=self.request.user)

class ProjectView(viewsets.ModelViewSet):
    serializer_class = ProjectSerializer
    permission_classes = [IsAuthenticated]
    authentication_classes = (TokenAuthentication, )

    # 过滤仅返回当前用户创建的项目
    def get_queryset(self):
        return Project.objects.filter(creator=self.request.user)
    
    # 创建时自动填充创建人
    def perform_create(self, serializer):
        serializer.save(creator=self.request.user)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:24:03