Используя следующий надуманный пример:
from django.db import models
from django_filters import FilterSet, OrderingFilter
from graphene import ObjectType, Schema, relay
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
class Recipe(models.Model):
name = models.CharField(max_length=50)
ingredients = models.ManyToManyField('Ingredient', related_name='recipes')
class Ingredient(models.Model):
name = models.CharField(max_length=50)
class RecipeFilter(FilterSet):
order_by = OrderingFilter(fields=[('name', 'name')])
class Meta:
fields = {'name': ['icontains']}
model = Recipe
class IngredientFilter(FilterSet):
order_by = OrderingFilter(fields=[('name', 'name')])
class Meta:
fields = {'name': ['icontains']}
model = Ingredient
class RecipeNode(DjangoObjectType):
ingredients = DjangoFilterConnectionField(IngredientNode, filterset_class=IngredientFilter)
class Meta:
interfaces = [relay.Node]
model = Recipe
only_fields = ['name']
class IngredientNode(DjangoObjectType):
recipes = DjangoFilterConnectionField(RecipeNode, filterset_class=RecipeFilter)
class Meta:
interfaces = [relay.Node]
model = Ingredient
only_fields = ['name']
class Queries(ObjectType):
all_recipes = DjangoFilterConnectionField(RecipeNode, filterset_class=RecipeFilter)
all_ingredients = DjangoFilterConnectionField(IngredientNode, filterset_class=IngredientFilter)
schema = Schema(query=Queries)
Как я могу определить циклическую связь между RecipeNode
и IngredientNode
, чтобы я мог выполнить следующий запрос GraphQL:
{
allRecipes(name_Icontains: "gg") {
edges {
node {
name
ingredients(name_Icontains: "gg") {
edges {
node {
name
}
}
}
}
}
}
allIngredients(name_Icontains: "gg") {
edges {
node {
name
recipes(name_Icontains: "gg") {
edges {
node {
name
}
}
}
}
}
}
}
В настоящее время я не могу ссылаться на IngredientNode
из RecipeNode
, так как он еще не определен. Если я попытаюсь использовать лямбду, как я видел в другом месте, я получаю AttributeError: 'function' object has no attribute '_meta'
.
class IngredientNode(DjangoObjectType):
recipes = DjangoFilterConnectionField(lambda: RecipeNode, filterset_class=RecipeFilter)
class Meta:
interfaces = [relay.Node]
model = Ingredient
only_fields = ['name']
Если я попытаюсь установить атрибут постфактум, я не смогу запросить ingredients
из рецепта. Ошибки нет, Graphiql просто ведет себя так, как будто ingredients
никогда не определялся.
class RecipeNode(DjangoObjectType):
class Meta:
interfaces = [relay.Node]
model = Recipe
only_fields = ['name']
class IngredientNode(DjangoObjectType):
recipes = DjangoFilterConnectionField(RecipeNode, filterset_class=RecipeFilter)
class Meta:
interfaces = [relay.Node]
model = Ingredient
only_fields = ['name']
RecipeNode.ingredients = DjangoFilterConnectionField(IngredientNode, filterset_class=IngredientFilter)
Я должен думать, что есть простое решение, которого я просто не вижу. Любая помощь будет оценена по достоинству. Спасибо!
Джанго 1.8.17, джанго-фильтр 0.15.3, графен-джанго 1.2.0