Приведение UUID к DangoObjectNode в подзапросе

У меня есть база данных с простой Employee моделью и узлом в Django. Я использую Graphene для создания API вокруг этого, который позволяет пользователю получить нужные данные.

class Employee(models.Model):
    id = models.UUIDField(primary_key=True, unique=True, )
    name = models.CharField(max_length=128)


class EmployeeNode(DjangoObjectType):
    class Meta:
        model = Employee
        fields = "__all__"
        interfaces = (graphene.relay.Node, )

Теперь в дополнение к этому, у меня есть запрос, который находит "приятеля" для каждого сотрудника, который является другим сотрудником (ID) в базе данных, и функция (детали здесь не имеют значения), которая находит нужного "приятеля" в базе данных, используя некоторый не уточненный Django запрос.

class EmployeeNodeWithBuddy(DjangoObjectType):
    buddy_id = graphene.UUID()

    class Meta:
        model = Employee
        fields = "__all__"
        interfaces = (graphene.relay.Node, )

    @classmethod
    def get_queryset(cls, queryset, info):
        set_with_buddy_annotation = queryset.annotate(
            buddy_id=ExpressionWrapper(Subquery( 
                 ### Omitting the details of this query ###
              ).only('id')[:1], output_field=models.UUIDField()
            ), output_field=models.UUIDField())
        )
        return set_with_buddy_annotation

Это работает нормально, но на самом деле мне нужен не ID приятеля, а фактический EmployeeNode. Я не могу понять, есть ли хороший способ аннотировать/добавить информацию к этому запросу, чтобы он вернул то, что я хочу. Это будет выглядеть так:

class EmployeeNodeWithBuddy(DjangoObjectType):
    buddy_id = graphene.UUID()
    buddy = graphene.Field(EmployeeNode) # Field with EmployeeNode instead of just ID!

    class Meta:
        model = Employee
        fields = "__all__"
        interfaces = (graphene.relay.Node, )

    @classmethod
    def get_queryset(cls, queryset, info):
        set_with_buddy_annotation = queryset.annotate(
            buddy_id=ExpressionWrapper(Subquery( 
                 ### Omitting the details of this query ###
              ).only('id')[:1], output_field=models.UUIDField()
            ), output_field=models.UUIDField())
        )

        set_with_buddy_annotation = # Somehow fetch the EmployeeNode from the buddy_id  here?

        return set_with_buddy_annotation

Имеет ли это смысл делать и возможно ли это вообще?

Вернуться на верх