繁体   English   中英

通过graphene-django中的主键查找(带有中继)

[英]Look up by primary key in graphene-django (with relay)

我希望能够使用人工主键而不是不透明的中继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,因此我也希望对此提供支持。

关于如何设置自定义滤镜集的任何想法,或者是否有使用石墨烯-django的本机方法?

您可能只想使用默认的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
   }
}

让我知道这是否适合您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM