如何使用 django_graphene 解析 django 模型的自定义字段?

Posted

技术标签:

【中文标题】如何使用 django_graphene 解析 django 模型的自定义字段?【英文标题】:How can I resolve custom fields for django models using django_graphene? 【发布时间】:2019-03-16 23:12:54 【问题描述】:

查看 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 = ???

我知道我可以为 Query 编写单独的字段和解析器对,但我希望它可以作为该模型架构的一部分使用。

我意识到我能做什么:

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()

但是——这意味着一个单独的往返,获取 id 然后获取该项目的 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/#resolvers

函数名称相同,但参数化不同。

【讨论】:

以上是关于如何使用 django_graphene 解析 django 模型的自定义字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在解析do while / while时解决移位/减少冲突

解析 SVG 路径元素中的 d 属性

Ocaml - 文件和解析

使用/解析远程变量时如何正确转义单引号? [复制]

链接器如何使用静态库解析引用

如何解析比较两个范围的条件格式?