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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:40:24