Приведение 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
Имеет ли это смысл делать и возможно ли это вообще?