在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
相关产品推荐
相关产品推荐

