代码之家  ›  专栏  ›  技术社区  ›  ccsv

基于id的中继限制查询访问的django石墨烯

  •  1
  • ccsv  · 技术社区  · 6 年前

    我试图将单个对象查询限制为创建它们的用户。

    模型.py

    class Env(models.Model):
        name = models.CharField(max_length=50)
        user = models.ForeignKey(
            User, on_delete=models.CASCADE)
        description = TextField()
    

    模式.py

    class EnvNode(DjangoObjectType):
        class Meta:
            model = Env
            filter_fields =  {
                'name': ['iexact'],
                'description': ['exact', 'icontains'],
                }
            interfaces = (relay.Node, )
    
    
    Query(object):
        env = relay.Node.Field(EnvNode)
        all_envs = DjangoFilterConnectionField(EnvNode)
    

    我试图添加一个解析查询,但是 only worked for the "all_env" query 使用筛选器,但不适用于单个对象查询

    def resolve_env(self, info):
        env = Env.objects.filter(user = info.context.user.id)
        if env is not None:
            return env
        else:
            return None
    

    还尝试按照建议将类方法添加到envnode here under filtering Node based ID access 以下内容:

    @classmethod
    def get_node(context, cls, id, info):
        try:
            env =  cls._meta.model.objects.get(id = id)
        except cls._meta.model.DoesNotExist:
            return None
    
        if context.user == env.user:
            return env
        return None
    

    但我犯了个错误:

    "message": "get_node() missing 1 required positional argument: 'info'",
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Marco    6 年前

    似乎文档不正确,而且参数的顺序也不正确 获取节点 方法。

    这个调用只有三个参数

    • 第一个是你的 djangoobjecttype 子类: 环境节点
    • 第二个是 graphql.execution.base.resolveinfo图 其中包含对上下文的引用。你可以从那里得到用户对象。
    • 第三个是实际的 身份证件 为了这个目标。

    你应该这样写,以限制工作:

    @classmethod
    def get_node(cls, info, id):
        try:
            env = cls._meta.model.objects.get(id=id, user=info.context.user)
    
        except cls._meta.model.DoesNotExist:
            return None
    
        return env
    

    希望有帮助。