【问题标题】:Graphene Django without Django Model?没有 Django 模型的石墨烯 Django?
【发布时间】:2018-01-29 02:04:15
【问题描述】:

我已经成功使用 Graphene-Django 成功构建了几个 GraphQL 调用。在所有这些情况下,我全部或部分填充了 Django 模型,然后返回了我填充的记录。

现在我想返回一些我不想存储在 Django 模型中的数据。这可能与石墨烯有关吗?

罗伯特

【问题讨论】:

  • 既然数据不会保存在数据库中,它们应该保存在哪里?由外部资源获取?一个永久的字符串还是什么?请提供有关您的用例的更多详细信息。
  • 在一个用例中,数据将来自外部服务器。在另一种情况下,结果将严格地是逻辑的结果,而不是从 Django DB 表中查找的结果。
  • 一位同事帮我找到了解决方案。我将使其通用,以便每个人都可以理解该方法。假设您想要一个名为“best_cities”的 GraphQL 查询。在您的类 Query 中,您可以创建以下内容: best_cities = graphene.String(state_id=graphene.String()) 在这里您传入一个状态 ID,然后将使用逻辑生成带有响应的 JSON 字符串。然后在下面你只需要添加这个: def resolve_best_cities(self, args, context, info): 在这个函数中你添加自定义逻辑。根本不使用 Django 模型。
  • @Robert_LY 如果我想添加 graphql 突变而不是查询而不映射到 Django 模型。这是否同样有效?

标签: python django django-models graphene-python


【解决方案1】:

当您将 Django 模型映射到 GraphQL 时,它会根据 Django 模型的自省创建一个具有 GraphQL 对象类型的新模型。 没有什么能阻止您将此模型与普通 GraphQL 对象类型相结合,或从其他第三方持久性模型映射

【讨论】:

    【解决方案2】:

    Robert_LY 在 cmets 中完美回答了他自己的问题,我只是想扩展他的解决方案。

    我的无数据库模型 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 中访问它们。

    【讨论】:

    • 我真的很喜欢这个答案,因为它具有使用本机模型字段生成 graphql 字段的优势,但我得到“graphql.error.located_error.GraphQLLocatedError: resolve_word_forms() got an unexpected keyword argument' some_id'”。我使用参数格式“(root, info, **kwargs)”解决了这个问题
    猜你喜欢
    • 2018-06-28
    • 2018-01-11
    • 2020-09-01
    • 2019-04-28
    • 2018-11-14
    • 2021-09-25
    • 2020-09-05
    • 2017-08-20
    • 2020-09-03
    相关资源
    最近更新 更多