Как я могу разрешить настраиваемые поля для моделей django, используя django_graphene? - PullRequest
0 голосов
/ 11 октября 2018

Глядя на 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 Ответ

0 голосов
/ 12 октября 2018

Хорошо, я могу заставить его работать, используя:

# 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

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

...