#django #neo4j #graphql #graphene-python #graphene-django
#django #neo4j #graphql #graphene-python #graphene-django
Вопрос:
Я пытаюсь создать простое приложение (для создания graphql api с использованием django и python). Все идет хорошо, но я застрял с одной проблемой, и я понятия не имею, как с этим справиться (я искал несколько дней, но я просто сдаюсь), поэтому я надеялся, что кто-нибудь здесь сможет помочь (смотрите Ниже, что у меня есть).
Я использую Django с graphene-django и neo4j в качестве базы данных (graph). Также я использую схему ретрансляции.
С помощью graphql я могу запрашивать все свойства продуктов, а также можно запрашивать отношения (какой продукт принадлежит к какой категории и наоборот).
Теперь моя проблема заключается в следующем: в neo4j отношения также имеют свои собственные свойства, но я понятия не имею, как получить эти свойства (например, я хочу видеть, когда было создано отношение, это свойство отношения).
В настоящее время у меня есть 2 типа узлов: Категория и продукт См. модели (models.py) ниже:
class Category(StructuredNode):
name = StringProperty()
shortname = StringProperty()
product = Relationship('Product','IN_CATEGORY')
class Product(StructuredNode):
name = StringProperty()
price = StringProperty()
description = StringProperty()
category = Relationship('Category','IN_CATEGORY')
Ниже приведен код graphene-django, который я использую (schema.py):
class CategoryType(DjangoObjectType):
class Meta:
model = Category
neomodel_filter_fields = {
'name': ['exact', 'icontains'],
'shortname': ['exact'],
}
interfaces = (relay.Node, )
class ProductType(DjangoObjectType):
class Meta:
model = Product
neomodel_filter_fields = {
'name': ['exact', 'icontains'],
'price': ['exact'],
}
interfaces = (relay.Node, )
Я подумал о том, что, возможно, я могу попытаться создать дополнительное поле и написать распознаватель, который выполняет необработанный запрос для получения отношений и свойств (как показано ниже)
class ProductType(DjangoObjectType):
relationship = graphene.String()
class Meta:
model = Product
neomodel_filter_fields = {
'name': ['exact', 'icontains'],
'price': ['exact'],
}
interfaces = (relay.Node, )
def resolve_relationship(root,info, args):
#perform the raw query here
Теперь, чтобы выполнить взаимосвязь, мне, конечно, нужны 2 идентификатора, чтобы выполнить запрос следующим образом:
совпадение (n: Категория)-[r]->(x: Продукт), где id (n) = 2358 И id (x) = 187 возвращают n, x, r
таким образом, я могу получить свойства отношений r.
Моя проблема в том, что я не могу получить идентификатор подключенного узла (только root.id).Есть ли способ получить родительский идентификатор? Или весь мой образ мышления неверен, и есть функция (о которой я не знаю, может быть, в graphene?) это может сделать то, что я хочу, другим (надеюсь, лучшим) способом?
Спасибо за помощь.
Ответ №1:
Я не использовал neo4j с django, но это должно сработать:
class ProductType(DjangoObjectType):
relationship = graphene.String()
class Meta:
model = Product
neomodel_filter_fields = {
'name': ['exact', 'icontains'],
'price': ['exact'],
}
interfaces = (relay.Node, )
def resolve_relationship(self, root,info, args):
return self.id # or self.relationship.id or do any thing you want
Свойства модели также могут работать
Вам необходимо добавить relationship = graphene.String(source="<name-of-the-property>")