Как я могу разрешить настраиваемые поля для моделей django, используя django_graphene?
Глядя на 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?
1 ответ
Хорошо, я могу заставить его работать, используя:
# 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/
То же имя функции, но параметризовано по-разному.