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

时间:2018-10-11 19:14:04

标签: python django graphql graphene-python

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

但是-这意味着要进行一次单独的往返,要获取ID,然后获取该商品的custom_field,对吗?

有没有办法将其视为RecipeType模式的一部分?

1 个答案:

答案 0 :(得分:0)

好的,我可以使用以下方法使它工作:

# 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

相同的函数名称,但参数设置不同。