如何解决具有多对多关系的石墨烯django节点场



当我试图解析具有多对多关系的节点字段时,我会得到"接收到不兼容的实例错误"。我需要帮助来解决这个问题。我列出了石墨烯django中的模型、graphql类型以供参考。

我使用的代码版本:
graphene django版本:2.2.0
python版本:3.5.2
django版:(2,0,8,'final',0(

models.py
---------
class ModelA:
name
description
Class ModelB:
model_code
description
field3
field4
model_links = models.ManyToManyField(ModelA, through='ModelAModelB')
class ModelAModelB:
model_a = models.ForeignKey('ModelA', null=True, on_delete=models.CASCADE, db_index=False)
model_b = models.ForeignKey('ModelB', null=True, on_delete=models.CASCADE, db_index=False)
class Meta:
#index is defined here

Graphene Django:

Type Definition
---------------
class ModelANode(DjangoObjectType):
class Meta:
model = ModelA
interfaces = (graphene.relay.Node, )
class ModelBNode(DjangoObjectType):
modellinks = graphene.Field(ModelANode)
class Meta:
model = ModelB
interfaces = (graphene.relay.Node, )
def resolve_modellinks(self, info, **args):
#how do i resolve this field
#I tried the below code
modelB = ModelB.objects.get(id=self.id)
modelaIDs = modelB.modelamodelb_set.select_related('model_a').values_list('model_a_id', flat=True)
modelARecs = ModelA.objects.filter(id__in=modelaIDs)
return [graphene.relay.Node.get_node_from_global_id(
'ModelANode', 
info,
to_global_id('ModelANode', rec.id) 
) for rec in modelARecs]
Graphql Call:
------------
allmodelBs {
model_code
description
field3
field4
modellinks {
id
}
}

我得到了模型B字段的数据,但模型链接显示了以下错误:

"errors": [
{
"message": "Received incompatible instance "[None, None]"."
},
{
"message": "Received incompatible instance "[]"."
}
]

我需要帮助来解决多对多关系节点字段。

由于没有用法上下文,我将提到以下内容。

DjangoObjectType有一个很好的特性-您可以使用纯django模型实例来代替它,并且:

  1. 解析结束后,它将转换为graphql类型
  2. resolve_*方法中的self将是实际的django模型

所以你可以使用它:

modelARecs = [rel.model_a for rel in self.modelamodelb_set.all()]

代替:

modelB = ModelB.objects.get(id=self.id)
modelaIDs = modelB.modelamodelb_set.select_related('model_a').values_list('model_a_id', flat=True)
modelARecs = ModelA.objects.filter(id__in=modelaIDs)

并且只返回modelARecs,因为它是django模型DjangoObjectType的声明对象。

最新更新