Django 石墨烯中继限制对用户拥有的对象的查询

Posted

技术标签:

【中文标题】Django 石墨烯中继限制对用户拥有的对象的查询【英文标题】:Django graphene relay restricting queries to objects owned the user 【发布时间】:2018-11-27 16:35:48 【问题描述】:

我正在做关于使用继电器过滤的石墨烯教程:http://docs.graphene-python.org/projects/django/en/latest/filtering/ 用户仅限于查询他们之前创建的对象。我正在使用石墨烯 2、django 2 和 django-filter 1.11。

class AnimalFilter(django_filters.FilterSet):
    # Do case-insensitive lookups on 'name'
    name = django_filters.CharFilter(lookup_expr=['iexact']) #changed this to work

    class Meta:
        model = Animal
        fields = ['name', 'genus', 'is_domesticated']

    @property
    def qs(self):
        # The query context can be found in self.request.
        return super(AnimalFilter, self).qs.filter(owner=self.request.user)

我正在插入self.request.user 部分,其中加载了用户数据。当我进行如下查询时:

query 
  allAnimalss 
    edges 
      node 
        id,
        name
      
    
  

我在查询字段中收到错误:


  "errors": [
    
      "message": "'NoneType' object has no attribute 'user'",
      "locations": [
        
          "line": 2,
          "column": 3
        
      ]
    
  ],
  "data": 
    "allAnimals": null
  

如果我删除过滤器,它会正常工作。该教程提到“由经过身份验证的用户拥有(在 context.user 中设置)”。这是什么意思?

我尝试将 get_context_data 函数添​​加到 views.py

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['user'] = self.request.user
    return context

还将self.request.user 更改为self.context.user,但它不起作用

【问题讨论】:

【参考方案1】:

您可以通过解析器方法中的 info.context 访问请求,从而访问用户。文档并不能很好地解释这一点,但 here you can see an example

def resolve_something(self, info, something_id):
    # Here info.context is the django request object
    something = Something.objects.get(something_id)
    if info.context.user.id == something.user_id:
        # The user owns this object!
        return something

    # Return None or raise an exception here maybe since it's not the owner
    return None

【讨论】:

在查询类下使用 resolve_something 的示例有效。但是“过滤基于ID的节点访问”中的示例没有

以上是关于Django 石墨烯中继限制对用户拥有的对象的查询的主要内容,如果未能解决你的问题,请参考以下文章

聚合石墨烯/django 查询中的字段

将 json 转换为石墨烯 graphql 响应

将json转换为石墨烯graphql响应

Django 石墨烯,按对象过滤

Django 模型对象和石墨烯 get_node

为中继自动生成 graphql 模式(石墨烯服务器)