Как я могу разрешить настраиваемые поля для моделей 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/

То же имя функции, но параметризовано по-разному.

Другие вопросы по тегам