Как разрешить графен.Юнион Тип? - PullRequest
0 голосов
/ 06 мая 2019

Я хочу создать UnionType (graphene.Union) из двух существующих типов (FirstType и SecondType) и иметь возможность разрешить запрос этого типа объединения.


Схема

    class FirstType(DjangoObjectType):
        class Meta:
            model = FirstModel

    class SecondType(DjangoObjectType):
        class Meta:
            model = SecondModel

    class UnionType(graphene.Union):
        class Meta:
            types = (FirstType, SecondType)

Так что с этой схемой я хочу запросить все объекты из FirstType и SecondType с pk в некотором списке [pks]

    query {
        all_items(pks: [1,2,5,7]){
          ... on FirstType{
             pk,
             color, 
          }

          ... on SecondType{       
             pk,        
             size,
          }
        }
     }

PK из FirstType обычно не входят во SecondType.

Я попробовал, как показано ниже

    def resolve_items(root, info, ids):
        queryset1 = FirstModel.objects.filter(id__in=pks)
        queryset2 = SecondModel.objects.filter(id__in=pks)
        return queryset1 | queryset2

но выдает ошибку: «Невозможно объединить запросы в двух разных базовых моделях».

Я ожидаю следующий ответ от запроса:

    { 'data':
        {'all_items':[
           {'pk': 1,
            'color': blue
           },
           {'pk': 2,
            'size': 50.0
           },
           ...
          ]}
     }

Так как должен выглядеть резольвер?

1 Ответ

0 голосов
/ 06 мая 2019

Хорошо, поэтому я был слишком сосредоточен на объединении наборов запросов и не заметил, что могу просто вернуть список.

Итак, вот решение, которое дает мне ответ, который я ищу:

def resolve_items(root, info, ids):
    items = []
    queryset1 = FirstModel.objects.filter(id__in=pks)
    items.extend(queryset1)
    queryset2 = SecondModel.objects.filter(id__in=pks)
    items.extend(queryset2)
    return items
...