Django+DRF:如何为当前用户过滤外键关联的分类选项
解决方案
1. 在Transaction序列化器中动态过滤分类查询集
在你的Transaction序列化器里,通过重写__init__方法,利用请求上下文获取当前用户,然后过滤category字段的查询集,只保留当前用户的UserCategories数据:
from rest_framework import serializers from .models import Transaction, UserCategories class TransactionSerializer(serializers.ModelSerializer): class Meta: model = Transaction fields = ["id", "category", "amount", "remark", "created_at"] # 替换为你的实际字段 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 从上下文获取当前授权用户 user = self.context["request"].user if user.is_authenticated: # 过滤category字段的可选范围为当前用户的分类 self.fields["category"].queryset = UserCategories.objects.filter(user=user)
2. 添加分类归属验证(可选但推荐)
为了防止用户通过手动构造请求传入不属于自己的分类ID,在序列化器中添加字段验证逻辑:
def validate_category(self, value): current_user = self.context["request"].user if value.user != current_user: raise serializers.ValidationError("该分类不属于当前用户,无法使用") return value
3. 确保Transaction视图关联当前用户
在处理Transaction的视图中,自动关联当前用户并只返回用户自己的交易数据,避免越权访问:
from rest_framework import viewsets from .models import Transaction from .serializers import TransactionSerializer class TransactionViewSet(viewsets.ModelViewSet): serializer_class = TransactionSerializer def get_queryset(self): # 仅返回当前用户的交易记录 return Transaction.objects.filter(user=self.request.user) def perform_create(self, serializer): # 创建交易时自动绑定当前用户 serializer.save(user=self.request.user)
方案优势
- 无需修改Djoser的任何代码:所有逻辑都在你自己的序列化器和视图中实现,完全兼容Djoser的认证体系。
- 前端展示与后端验证双重保障:既让前端(如DRF的浏览器API界面)只显示当前用户的分类选项,又在后端拦截非法的分类ID传入。
内容的提问来源于stack exchange,提问作者Fmx
相关产品推荐
相关产品推荐

