【问题标题】:Graphene-django returns null node instead of just node fieldGraphene-django 返回空节点而不仅仅是节点字段
【发布时间】:2018-04-17 03:22:12
【问题描述】:

我在使用石墨烯和 Django 时遇到了一个奇怪的问题。该文档似乎缺乏解决方案,我无法弄清楚我做错了什么。

我有以下型号:

Class Sentence(models.Model):
    ref = models.CharField(max_length=30, primary_key=True)
    body = models.TextField(default=None)

Class Summary(models.Model):
    sentence = models.ForeignKey(Sentence, on_delete=models.CASCADE)
    text = models.TextField(default=None)

(每个句子可以有多个摘要)

还有以下架构:

Class SentenceType(DjangoObjectType):
    class Meta:
        model = models.Sentence
        filter_fields = {"ref": ["exact"]}
        interfaces = (graphene.Node, )

Class SummaryType(DjangoObjectType):
    class Meta:
        model = models.Summary
        filter_field = {"text": ["icontains"]}
        interfaces = (graphene.Node, )

Class Query(graphene.ObjectType):
    all_sentences = DjangoFilterConnectionField(SentenceType)
    sentence = graphene.Field(SentenceType, ref=graphene.string(), body=graphene.string())
    all_summary = all_provvedimenti = DjangoFilterConnectionField(SummaryType)
    summary = graphene.field(SummaryType, id=graphene.Int(), text=graphene.string())

def resolve_all_summaries(self, context, **kwargs):
    return models.Summary.objects.all()

我的数据库中可能有一个或多个摘要没有对应的句子。

现在,当我查询时

{
  allSummaries{
    edges{
      node{
        text
        sentence{
          ref
        }
      }
    }
  }
}

如果该句子对于摘要存在,则完全没有问题。 但如果没有对应的句子我得到:

"errors": [
    {
      "message": "Sentence matching query does not exist.",
      "locations": [
        {
          "line": 6,
          "column": 9
        }
      ]
    }
],
...,
...,
"data":[
    ...,
    {
      "node": null
    },
    {
      "node":{
        "text": "blah blah blah sentence summary"
        "sentence": {
          "ref": "sentence_reference"
        }
      }
    }
    {
      "node": null
    },
    ...,
]

当然,我期望的输出是,每当摘要节点不存在相应的句子时,它仍然会给我返回摘要文本和“句子”:null 或 []。

我在文档或谷歌中没有运气。似乎我是唯一一个有这个问题的人。我不明白我是在 Django、石墨烯中犯了一些错误,还是只是一个错误。

有什么建议吗?

【问题讨论】:

  • 除了解析代码外,您是否尝试过?看起来您从该代码中得到了异常。另外,您的句子是从models.model而不是models.Model继承的,不确定是否有意。
  • 我知道我可以处理异常,但它不能解决我的问题,因为代码最后一行的错误:它需要返回一个由石墨烯处理的数据集;如果我手动处理异常,我还应该手动过滤数据集两次(包含和不包含包含某个单词的句子的摘要),然后将它们组合起来,我想避免这种情况。 models.Model 只是我在这里打的一个错字...谢谢。

标签: python django django-models graphene-python


【解决方案1】:

更改此行中的all_summary 变量

all_summary = all_provvedimenti = DjangoFilterConnectionField(SummaryType)

allSummaries

然后在

中更改您的函数名称
def resolve_all_summaries(self, context, **kwargs):

也发给resolve_allSummaries

然后你可以查询:

 {
  allSummaries{
    edges{
      node{
        text
        sentence{
          ref
        }
      }
    }
  }
}

这三个标识符都指向同一个东西,因此需要匹配

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 2019-09-22
    • 2018-04-29
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多