Глядя на graphene_django, я вижу, что у них есть куча резолверов, которые собирают поля модели django, сопоставляя их с типами графена.
У меня есть подкласс JSONField, я тоже хотел бы, чтобы его подобрали.
:
# models
class Recipe(models.Model):
name = models.CharField(max_length=100)
instructions = models.TextField()
ingredients = models.ManyToManyField(
Ingredient, related_name='recipes'
)
custom_field = JSONFieldSubclass(....)
# schema
class RecipeType(DjangoObjectType):
class Meta:
model = Recipe
custom_field = ???
Я знаю, что могу написать отдельное поле и пару преобразователя для запроса, но я бы предпочел, чтобы они были доступны как часть схемы для этой модели.
Что я понимаю, что могу:
class RecipeQuery:
custom_field = graphene.JSONString(id=graphene.ID(required=True))
def resolve_custom_field(self, info, **kwargs):
id = kwargs.get('id')
instance = get_item_by_id(id)
return instance.custom_field.to_json()
Но - это означает отдельную поездку туда и обратно, чтобы получить идентификатор, а затем получить custom_field для этого элемента, верно?
Могу ли я увидеть это как часть схемы RecipeType?






Хорошо, я могу заставить его работать, используя:
# schema
class RecipeType(DjangoObjectType):
class Meta:
model = Recipe
custom_field = graphene.JSONString(resolver=lambda my_obj, resolve_obj: my_obj.custom_field.to_json())
(custom_field имеет метод to_json)
Я понял это без глубокого понимания того, что происходит на этой карте между типами графена и типами полей модели django.
Это основано на этом: https://docs.graphene-python.org/en/latest/types/objecttypes/#resolvers
То же имя функции, но по-разному параметризованные.