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

如何为Graphene的DjangoFilterConnectionField配置权限并解决参数错误?

解决方案

1. 修复参数错误

你遇到的unexpected keyword argument 'first'错误,是因为resolve_all_users方法没有接收Graphene连接字段自动传递的分页/过滤参数(如first、last、before、after以及过滤条件)。需要在方法签名中添加**kwargs来捕获这些参数:

def resolve_all_users(self, info, **kwargs):
    # 逻辑代码

2. 实现登录权限控制

直接使用Django的@login_required装饰器无法适配Graphene的resolve上下文,建议手动校验登录状态或自定义适配装饰器:

方式一:手动校验(最直接)

在resolve方法内判断用户是否登录,未登录则抛出GraphQL错误:

from graphql import GraphQLError
from django.contrib.auth.models import User
from .filters import UserFilter
from graphene_django.utils import maybe_queryset

def resolve_all_users(self, info, **kwargs):
    # 校验登录状态
    if not info.context.user.is_authenticated:
        raise GraphQLError("必须登录才能访问该资源")
    
    # 获取基础用户查询集
    queryset = User.objects.all()
    
    # 应用UserFilter过滤条件
    filterset = UserFilter(data=kwargs, queryset=queryset, request=info.context)
    if filterset.is_valid():
        queryset = filterset.qs
    
    # 返回处理后的查询集,Graphene会自动处理分页逻辑
    return maybe_queryset(queryset)

方式二:自定义适配装饰器

如果需要复用登录校验逻辑,可以写一个专门适配Graphene resolve方法的装饰器:

from graphql import GraphQLError

def graphene_login_required(func):
    def wrapper(self, info, **kwargs):
        if not info.context.user.is_authenticated:
            raise GraphQLError("必须登录才能访问")
        return func(self, info, **kwargs)
    return wrapper

# 使用装饰器
@graphene_login_required
def resolve_all_users(self, info, **kwargs):
    queryset = User.objects.all()
    filterset = UserFilter(data=kwargs, queryset=queryset, request=info.context)
    if filterset.is_valid():
        queryset = filterset.qs
    return maybe_queryset(queryset)

3. 关于返回值

resolve方法需要返回经过过滤的模型查询集,DjangoFilterConnectionField会自动处理first/last等分页参数,无需手动实现分页逻辑。maybe_queryset工具函数用于确保返回的查询集符合Graphene的处理要求。

对all_leagues字段的复用

同样的逻辑可以直接复制到resolve_all_leagues方法中,替换对应的模型(League)和过滤器(LeagueFilter)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:42:53