Graphene Django без модели Django?

Я успешно использовал Graphene-Django для успешного создания нескольких вызовов GraphQL. Во всех этих случаях я полностью или частично заполнял модель Django, а затем возвращал заполненные мной записи.

Теперь у меня возникла ситуация, когда я хотел бы вернуть некоторые данные, которые я не хочу хранить в модели Django. Можно ли это сделать с графеном?

Роберт


person Robert_LY    schedule 21.08.2017    source источник
comment
Поскольку данные не будут храниться в базе данных, где они должны находиться? Получено с внешнего ресурса? Постоянная струна или что-то в этом роде? Расскажите подробнее о своем варианте использования.   -  person nik_m    schedule 21.08.2017
comment
В одном случае данные будут поступать с внешнего сервера. В другом случае результаты будут строго логическим, а не поиском из таблицы Django DB.   -  person Robert_LY    schedule 21.08.2017
comment
Коллега помог мне найти решение. Я сделаю его общим, чтобы каждый мог понять подход. Предположим, вам нужен запрос GraphQL с именем best_cities. В своем классе Query вы можете создать это: best_cities = graphene.String (state_id = graphene.String ()) Здесь вы передаете идентификатор состояния, а затем логика будет использоваться для генерации строки JSON с ответом. Затем ниже вам просто нужно добавить это: def resolve_best_cities (self, args, context, info): в этой функции вы добавляете настраиваемую логику. Модель Django вообще не используется.   -  person Robert_LY    schedule 21.08.2017
comment
@Robert_LY На случай, если я хочу добавить мутацию graphql вместо запроса без сопоставления с моделью Django. Это работает аналогично?   -  person thinwybk    schedule 15.01.2020


Ответы (2)


Robert_LY отлично ответил на свой вопрос в комментариях, я просто хотел бы расширить его решение.

Моя модель WordForm без базы данных создается автоматически, без сохранения в базе данных. Я определяю это как модель Django следующим образом:

from django.db import models
class WordForm(models.Model):
    value = models.CharField(max_length=100)
    attributes = models.CharField(max_length=100)

В схеме я определяю узел и выполняю такой запрос:

class WordFormNode(DjangoObjectType):
    class Meta:
        model = WordForm
        interfaces = (relay.Node, )

class Query(AbstractType):
    word_forms = List(WordFormNode,query=String(),some_id=String())

    def resolve_word_forms(self, args, context, info):
        query= args['query']
        some_id = from_global_id(args['some_id'])[1]
        word_forms = []
        # some logic to make WordForm objects with
        # WordForm(value=value,attributes=attributes),
        # then append them to list word_forms
        return word_forms

Вы можете передать в список столько аргументов, сколько захотите, и получить к ним доступ в resolve_word_forms.

person Pigmalijonas    schedule 26.01.2018
comment
Мне очень нравится этот ответ, потому что у него есть преимущество использования полей собственной модели для генерации полей graphql, но я получаю graphql.error.located_error.GraphQLLocatedError: resolve_word_forms () получил неожиданный аргумент ключевого слова 'some_id'. Я решил это, используя формат параметра (root, info, ** kwargs) - person cryptojesus; 03.04.2020

Когда вы сопоставляете свою модель Django с GraphQL, она создает новую модель с типами объектов GraphQL на основе интроспекции модели Django .. И ничто не мешает вам объединить эту модель с простыми типами объектов GraphQL или сопоставить их от другой третьей стороны. модель настойчивости

person Le Hibou    schedule 01.09.2017