【问题标题】:Look up by primary key in graphene-django (with relay)在graphene-django中按主键查找(带中继)
【发布时间】:2019-09-20 18:17:26
【问题描述】:

我希望能够使用人工主键而不是不透明的中继 ID 编写如下所示的查询:

query {
    issue(pk: 10) {
        pk
        state
    }
}

我已经能够从模型中添加 int pk 字段;但是,我无法弄清楚如何查询它(而且我对如何为此切换到自定义过滤器集感到有些困惑)。

from django.db import models
import graphene
from graphene import relay

class Issues(models.Model):
    state = models.CharField(default='')
    text = models.TextField(default='')

class IssueNode(DjangoObjectType):
   pk = graphene.Int(source='pk')
   class Meta:
       model = Issue
       interfaces = (relay.Node,)
       filter_fields = ['pk', 'state']

class Query(graphene.ObjectType):
    issue = relay.Node.Field(IssueNode)
    issues = DjangoFilterConnectionField(IssueNode)

这将引发关于pk 的错误:

TypeError: 'Meta.fields' contains fields that are not defined on this FilterSet: pk

通过此设置,我可以编写如下查询:

query {
    issue(id: 'ascadf2e31af=') {
        state
    }
}

但由于该应用程序以前使用人类可读的 ID,我也想支持它。

关于如何设置自定义过滤器集的任何想法,或者是否有使用 graphene-django 执行此操作的本地方法?

【问题讨论】:

    标签: django graphql graphene-python graphene-django


    【解决方案1】:

    您可能只想使用默认的 graphene.Field 并将其添加到您的代码中,如下所示:

    import graphene
    
    from django.shortcuts import get_object_or_404
    
    
    class Query(graphene.ObjectType):
       issue_by_pk = Field(IssueNode, pk=graphene.Int())
    
       def resolve_issue_by_pk(parent, info, **kwargs):
          pk = kwargs.get('pk')
          return get_object_or_404(models.Issue, pk=pk)
    
    
    

    您的 graphQL 查询

    query findIssue {
       issueByPk(pk:1){
          id # will return relay id
       }
    }
    

    让我知道这是否适合你。

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2018-10-29
      • 2018-08-25
      • 2023-03-11
      • 2019-02-12
      • 2021-09-24
      • 2019-10-31
      • 2021-07-10
      • 2013-10-18
      相关资源
      最近更新 更多