Как разрешить поле узла графена Джанго с отношением «многие ко многим» - PullRequest
0 голосов
/ 26 октября 2018

Я получаю сообщение «Ошибка полученного несовместимого экземпляра», когда пытаюсь разрешить поле узла с отношением «многие ко многим».Мне нужна помощь, чтобы решить эту проблему.Я перечислил модели, типы графиков в графене Джанго для справки.

Версия кода, которую я использую:
версия графена Джанго: 2.2.0
версии Python: 3.5.2
Джанговерсия: (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 \"[]\"."
    }
]

Мне нужна помощь для разрешения отношений "многие ко многим". Поле узла.

1 Ответ

0 голосов
/ 12 ноября 2018

Поскольку здесь нет контекста использования, я упомяну следующее:

DjangoObjectType имеет приятную особенность - вы можете использовать чистый экземпляр модели django вместо него и:

  1. Он будет преобразован в тип graphql по окончании разрешения
  2. self в ваших resolve_* методах будет действительная модель 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.

...